【问题标题】:Websockets in Jelastic: DeploymentException: The HTTP response from the server did not permit the HTTP upgrade to WebSocketJelastic 中的 Websocket:DeploymentException:来自服务器的 HTTP 响应不允许 HTTP 升级到 WebSocket
【发布时间】:2014-11-26 13:08:04
【问题描述】:

我正在尝试使用 websockets,所以我创建了这样的 WS 服务器:

@ServerEndpoint(value = "/chat")
public class WsChatServlet{
private static final Logger LOGGER =
        Logger.getLogger(WsChatServlet.class.getName());

@OnOpen
public void onOpen(Session session) {
    LOGGER.log(Level.INFO, "New connection with client: {0}",
            session.getId());
}

@OnMessage
public String onMessage(String message, Session session) {
    LOGGER.log(Level.INFO, "New message from Client [{0}]: {1}",
            new Object[] {session.getId(), message});
    return "Server received [" + message + "]";
}

@OnClose
public void onClose(Session session) {
    LOGGER.log(Level.INFO, "Close connection for client: {0}",
            session.getId());
}

@OnError
public void onError(Throwable exception, Session session) {
    LOGGER.log(Level.INFO, "Error for client: {0}", session.getId());
}
}

并将其部署在运行 Java 7 的 Tomcat 7 中。 然后我创建了那个客户端:

@ClientEndpoint
public class Main {
private static final String uri = "ws://myserver.net/chat";

public static void main(String[] args) throws DeploymentException, IOException, URISyntaxException, InterruptedException {
    WebSocketContainer wsContainer =  ContainerProvider.getWebSocketContainer();
    Session session = wsContainer.connectToServer(Main.class, new URI(uri));
    session.getBasicRemote().sendText("Here is a message!");
    Thread.sleep(1000);
    session.close();
}

@OnMessage public void processMessage(String message){
    System.out.println(message);
}
}

此客户端作为命令行应用程序运行。当我运行它时,我得到了异常:

Exception in thread "main" javax.websocket.DeploymentException: The HTTP response from the server [HTTP/1.1 302 Found] did not permit the HTTP upgrade to WebSocket

所以看起来服务器没有正确响应我的客户端。我注意到如果我访问ws://myserver.net/chat,它会响应 302,但对于ws://myserver.net/chat/(通知/)它会响应 200 OK。

更有趣的是这个 Tomcat 日志:

    • [01/Oct/2014:15:52:35 +0000] "GET /chat/ HTTP/1.0" 200 57
    • [01/Oct/2014:15:52:42 +0000] “GET /chat HTTP/1.0”302 -

如您所见,我的客户端连接的是 HTTP 1.0,而不是 1.1,这可能是错误的。 我完全被它困住了。不明白为什么它不起作用。

编辑: 所以,我的主要问题是为什么 websockets 不起作用(我猜 HTTP 升级响应标头丢失了)以及如何解决这个问题。

EDIT2: 我忘记了最重要的事情:我将它部署在免费的 Jelastic 环境中。

【问题讨论】:

    标签: java tomcat websocket jelastic


    【解决方案1】:

    所以最后我发现了问题所在,答案是:Jelastic。 我将我的应用程序部署到了免费的 Jelastic 实例,这意味着所有请求都由 nginx 代理。如here 所述,您必须获取公共 IP 才能让您的应用在 Jelastic 中使用 WebSockets。

    【讨论】:

    • 所以如果我在 Jelastic 中没有公共 IP,我的 websocket 就无法工作?
    • @KuKeC 没错:没有公共 IP 就无法让 websocket 工作
    【解决方案2】:

    如维基百科所述:

    HTTP 响应状态码 302 Found 是执行 URL 重定向的常用方式

    200 OK 是

    成功的 HTTP 请求的标准响应

    因此,根据您的情况,我猜您的资源管理器正在使用尾部斜杠保存第一个请求,无论哪种情况,http 状态都是 Found 或 OK,资源已找到。

    最后我猜想将 sessionCookiePathUsesTrailingSlash 的值更改为 false 可以解决问题,并且响应总是 200 OK。 (更改它检查this

    如果这不起作用,很多原因可以推动tomcat添加斜杠,其他原因检查this discussion

    【讨论】:

    • 好的,感谢 sessionCookiePathUsesTrailingSlash 的提示,但我的主要问题是为什么 websockets 不起作用(HTTP 升级响应标头丢失?)以及我该如何解决。跨度>
    • 为我们提供整个 webSocket 流量,以便我们了解发生了什么,如果需要,请使用 fiddler。
    猜你喜欢
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    相关资源
    最近更新 更多