我正在尝试使用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日志:
正如您可能看到我的客户端连接HTTP 1.0而不是1.1,这可能是错误的。 我完全被它搞砸了。不明白为什么它不起作用。
修改 所以,我的主要问题是为什么websockets不起作用(我想错过HTTP升级响应头)以及如何解决这个问题。
EDIT2: 我忘记了最重要的事情:我在免费的Jelastic环境中部署它。
答案 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