2013-08-23 6 views
3

Я пытаюсь создать приложение javaee с помощью websockets, но не могу заставить программу работать правильно. Использование приложения Tomcat 7, Java EE 7 с веб-сайтами.Websocket не работает: неожиданный код ответа 404

Вот мой Java-код:

import javax.websocket.CloseReason; 
import javax.websocket.EndpointConfig; 
import javax.websocket.OnClose; 
import javax.websocket.OnError; 
import javax.websocket.OnMessage; 
import javax.websocket.OnOpen; 
import javax.websocket.RemoteEndpoint; 
import javax.websocket.Session; 
import javax.websocket.server.ServerEndpoint; 

@ServerEndpoint(value="/hello") 
public class EchoEndpoint { 
    RemoteEndpoint.Async endpoint; 
    @OnOpen 
    public void open(Session session, EndpointConfig conf) { 
     //Connection opened. 
     System.out.println("EchoEndpoint on open"); 
     endpoint = session.getAsyncRemote(); 
    } 

    @OnMessage 
    public void onMessage(Session session, String msg) { 
     //Message received. 
     System.out.println("EchoEndpoint on message"); 
    } 

    @OnError 
    public void error(Session session, Throwable error) { 
     //Connection error. 
     System.out.println("EchoEndpoint on error"); 
    } 

    @OnClose 
    public void close(Session session, CloseReason reason) { 
     //Connection closed. 
     System.out.println("EchoEndpoint on close"); 
    } 

    public void send(String string) { 
     System.out.println("Send called to EchoEndpoint"); 
     endpoint.sendText(string); 
    } 
} 

web.xml:

<?xml version="1.0" encoding="UTF-8"?> 

<web-app 
     version="3.0" 
     xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 

</web-app> 

index.html:

<!DOCTYPE html> 
    <meta charset="utf-8" /> 
    <title>WebSocket Test</title> 
    <script language="javascript" type="text/javascript"> 
     var wsUri = "ws://localhost:8080/myapp/hello"; 
     var output; 
     function init() { 
      output = document.getElementById("output"); 
      testWebSocket(); 
     } 

     function testWebSocket() { 
      websocket = new WebSocket(wsUri); 
      websocket.onopen = function(evt) { onOpen(evt) }; 
      websocket.onclose = function(evt) { onClose(evt) }; 
      websocket.onmessage = function(evt) { onMessage(evt) }; 
      websocket.onerror = function(evt) { onError(evt) }; 
     } 

     function onOpen(evt) { 
      writeToScreen("CONNECTED"); 
      doSend("WebSocket rocks"); 
     } 

     function onClose(evt) { 
      writeToScreen("DISCONNECTED"); 
     } 

     function onMessage(evt) { 
      writeToScreen('<span style="color: blue;">RESPONSE: ' + evt.data+'</span>'); 
      //websocket.close(); 
     } 

     function onError(evt) { 
      writeToScreen('<span style="color: red;">ERROR:</span> ' + evt.data); 
     } 

     function doSend(message) { 
      writeToScreen("SENT: " + message); 
      websocket.send(message); 
     } 

     function writeToScreen(message) { 
      var pre = document.createElement("p"); 
      pre.style.wordWrap = "break-word"; 
      pre.innerHTML = message; 
      output.appendChild(pre); 
     } 

     window.addEventListener("load", init, false); 
    </script> 

    <h2>WebSocket Test</h2> 
    <div id="output"></div> 
</html> 

На стороне клиента при попытке выполнить:

websocket = новый WebSocket (wsUri);

я получаю:

WebSocket подключение к WS: // локальный: 8080/MyApp/привет неуспешно: Неожиданный код Быстродействие: 404

ли я что-то пропустил в Интернете. xml или где-то еще?

+0

URL-адрес в '@ ServerEndpoint' является относительно корня сервлета, но я не вижу где-нибудь, что вы размещение сервлета под 'myapp'. Работает ли 'ws: // localhost: 8080/hello'? – chrylis

+0

@chrylis Нет, я его еще не пробовал – maximus

+0

Я не знаком с WebSockets, но я думаю, что проблема в том, что у вас нет «WebSocketServlet», который является «владельцем» для конечной точки и что ваша конечная точка класс не привязывается нигде. – chrylis

ответ

7

WebSocket реализован в Tomcat 7 путем расширения WebSocketServlet. Но API-интерфейс WebSocket 1.0 представлен в tomcat 8. Ваш код несовместим с Tomcat 7. Пожалуйста, используйте tomcat 8 и попробуйте то же самое.

Update ...

Теперь Tomcat7 поддерживает WebSocket, как @samael сказал

+2

Теперь WebSocket 1.0 можно использовать в Tomcat 7. Это для версии 7.0.47 и выше только при использовании Java 7. Старый способ расширение 'WebSocketServlet' устарело. – samael

+0

Было бы замечательно понять, какие версии поддерживают это решение. – ash

Смежные вопросы