2013-08-23 44 views
3

我想用websockets創建javaee應用程序,但無法讓程序正常工作。使用Tomcat 7,帶有websockets的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 = new WebSocket(wsUri);

我得到:

WebSocket連接到WS://本地主機:8080/MyApp的/你好失敗: 意外性反應代碼:404

我錯過了在網絡的東西。 XML或其他地方?

+0

在'@ ServerEndpoint'的URL相對於servlet的根,但我沒有看到任何地方,你把servlet放在'myapp'下面。 'ws:// localhost:8080/hello'是否工作? – chrylis

+0

@chrylis不,我沒有試過它 – maximus

+0

我對WebSockets並不熟悉,但我認爲問題在於您沒有一個「WebSocketServlet」,它是端點的「所有者」,並且您的端點班級沒有連接到任何地方。 – chrylis

回答

7

WebSocket通過擴展WebSocketServlet在Tomcat 7中實現。但在Tomcat 8中引入了WebSocket 1.0 API。您的代碼與Tomcat 7不兼容。請使用tomcat 8並嘗試使用它。

更新...

現在,Tomcat7支持的WebSocket作爲@samael說

+2

現在可以在Tomcat 7中使用WebSocket 1.0。只有在使用Java 7時,纔可以使用WebSocket 1.0。擴展'WebSocketServlet'已棄用。 – samael

+0

準確理解哪些版本支持哪種解決方案將會非常棒。 – ash

相關問題