2014-10-01 261 views
1

我試圖使用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環境中。

回答

2

所以最後我發現了什麼問題,答案是:Jelastic 。 我將我的應用程序部署到了免費的Jelastic實例,這意味着所有請求都由nginx代理。如提到的here,您必須獲得公共IP才能讓您的應用程序在Jelastic中使用WebSockets。

+0

因此,如果我沒有在Jelastic的公共IP我不能讓我的websocket工作? – KuKeC 2015-08-14 09:00:36

+0

@KuKeC沒錯:你不能在沒有公有IP的情況下讓websocket工作 – Andrew 2015-08-14 12:40:45

0

如所述由維基百科:

實測值的HTTP響應狀態代碼302是在執行URL重定向

和200 OK是

標準響應的一種常見的方式用於成功的HTTP請求

因此,根據你的情況,我猜你的資源管理器正在保存帶有斜線的第一個請求,無論哪種情況,http狀態爲Found或OK,都會找到資源。

最後我猜想sessionCookiePathUsesTrailingSlash的值改爲false會解決問題,響應總是200 OK。(改變它檢查this

如果沒有工作,很多原因可以把tomcat的添加斜線,檢查this discussion其他原因

+0

好的,感謝提示_sessionCookiePathUsesTrailingSlash_但我的主要問題是爲什麼websockets不工作(HTTP升級響應頭錯過了?),我該如何解決這個問題。 – Andrew 2014-10-02 05:49:23

+0

爲我們提供了整個webSocket流量,以便我們能夠理解發生了什麼,如果您願意,可以使用fiddler。 – 2014-10-02 09:57:40

相關問題