Websocket 不工作:意外响应代码 404

Posted

技术标签:

【中文标题】Websocket 不工作:意外响应代码 404【英文标题】:Websocket not working: unexpected responce code 404 【发布时间】:2013-08-23 13:09:32 【问题描述】:

我正在尝试使用 websockets 创建 javaee 应用程序,但是无法使程序正常工作。使用 Tomcat 7、带有 websockets 的 Java EE 7 应用程序。

这是我的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);

我明白了:

到 ws://localhost:8080/myapp/hello 的 Websocket 连接失败: 意外响应代码:404

我是否遗漏了 web.xml 或其他地方的某些内容?

【问题讨论】:

@ServerEndpoint 中的 URL 是相对于 servlet 的根目录的,但我没有看到您将 servlet 放在 myapp 下的任何地方。 ws://localhost:8080/hello 有效吗? @chrylis 不,我已经尝试过了 我不熟悉 WebSockets,但我认为问题在于您没有 WebSocketServlet 这是端点的“所有者”,并且您的端点类没有附加任何地方。 @chrylis 我正在阅读这份文档,其中没有提到任何关于 WebSocketServlet 的内容:docs.oracle.com/javaee/7/tutorial/doc/websocket.htm @chrylis 原因是 java ee 7 和 tomcat 7 不兼容。应该使用 Tomcat 8.. 【参考方案1】:

WebSocket 在 Tomcat 7 中通过扩展 WebSocketServlet 实现。但是在tomcat 8中引入了WebSocket 1.0 API。你的代码与Tomcat 7不兼容。请使用tomcat 8并尝试相同。

更新...

现在,正如@samael 所说,Tomcat7 支持 websocket

【讨论】:

WebSocket 1.0 现在可以在 Tomcat 7 中使用。仅在使用 Java 7 时适用于 7.0.47 及更高版本。不推荐使用旧的扩展 WebSocketServlet 的方式。 准确了解哪些版本支持哪种解决方案会很棒。

以上是关于Websocket 不工作:意外响应代码 404的主要内容,如果未能解决你的问题,请参考以下文章

webSocket 握手期间的错误意外响应代码:400

Django:WebSocket 握手期间出错:意外的响应代码:500

websocket失败:WebSocket握手期间出错:意外响应代码:400

WebSocket 握手 - 意外响应代码 200 - AngularJs 和 Spring Boot

WebSocket 握手期间出错:意外的响应代码:302

使用 Maven,WebSocket 连接失败:WebSocket 握手期间出错:意外响应代码:404