我試圖使用WebSockets玩,所以我創建WS服務器這樣的:的WebSockets在Jelastic:DeploymentException:來自服務器的HTTP響應沒有允許HTTP升級到WebSocket的
@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());
}
}
並部署它在Tomcat中7上的Java 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);
}
}
該客戶端作爲一個COMAND在線應用程序。當我運行它時,我得到異常:
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月/ 10月/ 2014:15:52:35 0000] 「GET /聊天/ HTTP/1.0」 200 57
-
- [01月/ 10月/ 2014:15:52:42 0000] 「GET /聊天HTTP/1.0」 302 -
正如你可能看到我的客戶端連接了HTTP 1.0而不是1.1,這可能是錯誤的。 我完全被它困住了。不明白爲什麼它不起作用。
編輯: 所以,我的主要問題是,爲什麼WebSockets的不工作(我猜的HTTP響應升級錯過頭),以及如何解決這個問題。
編輯2: 我忘了最重要的事情:我將它部署在免費的Jelastic環境中。
因此,如果我沒有在Jelastic的公共IP我不能讓我的websocket工作? – KuKeC 2015-08-14 09:00:36
@KuKeC沒錯:你不能在沒有公有IP的情況下讓websocket工作 – Andrew 2015-08-14 12:40:45