Jelastic中的Websockets:DeploymentException:来自服务器的HTTP响应不允许HTTP升级到WebSocket

时间:2014-10-01 16:05:45

标签: java tomcat websocket jelastic

我正在尝试使用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日志:

    • [2014年10月1日:15:52:35 +0000]“GET / chat / HTTP / 1.0”200 57
    • [2014年10月1日:15:52:42 +0000]“GET / chat HTTP / 1.0”302 -

正如您可能看到我的客户端连接HTTP 1.0而不是1.1,这可能是错误的。 我完全被它搞砸了。不明白为什么它不起作用。

修改 所以,我的主要问题是为什么websockets不起作用(我想错过HTTP升级响应头)以及如何解决这个问题。

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

如维基百科所述:

  

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

那200 OK就是

  

成功发出HTTP请求的标准响应

因此,基于您的情况,我猜您的资源管理器正在使用尾部斜杠保存第一个请求,在任何一种情况下,http状态为Found或OK,资源都已找到。

最后我想将 sessionCookiePathUsesTrailingSlash 的值更改为false将解决问题,响应将始终为200 OK。 (要更改它,请检查this

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