2014-10-01 3 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/Октябрь/2014: 15: 52: 35 +0000] "GET/чат/HTTP/1.0" 200 57
    • [01/октябрь/2014: 15: 52: 42 +0000] "GET/чат HTTP/1.0" 302 -

Как вы можете видеть, мой клиент подключается к HTTP 1.0, а не 1.1, что может быть неправильным. Я полностью застрял в этом. Не понимаю, почему это не работает.

EDIT: Итак, мой главный вопрос: почему WebSockets не работает (я думаю HTTP Upgrade заголовка ответа пропущенных) и как это исправить.

EDIT2: Я забыл, что самое главное: я размещаю его в свободной среде Jelastic.

ответ

2

Итак, наконец, я нашел то, что пошло не так, и ответ: Jelastic , Я развернул свое приложение для бесплатного экземпляра Jelastic, это означает, что все запросы были проксимизованы nginx. Как уже упоминалось, here, вы должны получить общедоступный IP-адрес, чтобы ваше приложение работало с WebSockets в Jelastic.

+0

Итак, если у меня нет публичного IP-адреса в Jelastic, я не могу заставить работать мой websocket? – KuKeC

+0

@KuKeC: вы не можете заставить websocket работать без общедоступного IP-адреса – Andrew

0

как заявил википедии:

Отклик HTTP код состояния 302 Найдено является общим способом выполнения URL Перенаправление

и что 200 OK является

Стандартный ответ для успешных запросов HTTP

Итак, исходя из вашей ситуации, я полагаю, что ваш проводник сохраняет первый запрос с завершающим косой чертой, в любом случае, статус http «Найден» или «ОК», ресурс найден.

Наконец-то я думаю, что изменение значения sessionCookiePathUsesTrailingSlash на false поможет решить проблему, и ответ будет всегда 200 OK.(Для изменения его проверить this)

, если это не работает, многие причины могут подтолкнуть кот добавить завершающий слэш, проверьте this discussion по другим причинам

+0

ОК, спасибо за подсказку с _sessionCookiePathUsesTrailingSlash_, но мой главный вопрос был в том, почему веб-порты не работают (HTTP-ответ заголовка ответа пропущен?) И как я могу это исправить. – Andrew

+0

предоставить нам весь трафик webSocket, чтобы мы могли понять, что происходит, используйте скрипт, если хотите. –