【问题标题】:WebSocket 404 errorWebSocket 404 错误
【发布时间】:2014-07-16 11:20:52
【问题描述】:

我正在尝试在我的网站上实现 WebSocket。按照基本教程我添加了这个类:

@ServerEndpoint(value="/websocketendpoint")
public class WebSocket {
    private static Set<Session> peers = Collections.synchronizedSet(new HashSet<Session>());

    @OnMessage
    public String onMessage(String message){ return null; }

    @OnOpen
    public void onOpen(Session peer){ peers.add(peer); }

    @OnClose
    public void onClose(Session peer){ peers.remove(peer); }
}

还有这个 JS:

var wsUri = "ws://" + document.location.host + document.location.pathname + "websocketendpoint";
var ws = new WebSocket(wsUri);
ws.onopen = function(){
    ws.send("Message to send");
    alert("Message is sent...");
};
ws.onmessage = function (evt){   
    var received_msg = evt.data;
    alert("Message is received...");
};
ws.onclose = function(){ 
    alert("Connection is closed...");
};

我将 js 添加到我的一个页面中,并且只调用了 ws.onclose,在控制台中我收到此错误:

Firefox: Firefox 无法与服务器建立连接 ws://localhost:8080/Mysite/websocketendpoint

Chrome:WebSocket 握手期间出错:意外响应代码: 404

我尝试使用 'ws://echo.websocket.org' 作为 wsUri 并且它有效,所以我猜问题出在服务器端。

我正在使用以下库:javaee-api-7.0、javax.websocket-api-1.0 我的浏览器与 websockets 兼容(我检查过)

类似的主题对我没有帮助,所以我想请你就如何解决问题提出建议

【问题讨论】:

  • Mysite 来自哪里? WAR 文件是否以该名称部署?服务器是否有任何其他路径元素用于 WS 端点?
  • @Tichodroma Mysite 是我在tomcat中的项目名称,我不确定你在第二个问题中的意思。

标签: tomcat jakarta-ee websocket


【解决方案1】:

您可能想检查这是否是您的错误的根源:tomcat 7.0.50 java webscoket implementation gives 404 error

Tomcat 从 7.0.47 版开始就有 JSR-356(即 websocket API)实现。它还提供了javax.websocket-api-1.0.jar 库,因此您的应用程序不需要它。您可能在编译时需要它,但服务器会在运行时提供它(如果您不熟悉该工具,这就是 provided 范围在 maven 中的含义)

确保javax.websocket-api-1.0.jar 没有部署在您的WAR 中,在您的Eclipse 服务器视图中右键单击Clean...,然后是Clean Tomcat work directory...,然后是Publish,然后重试。

【讨论】:

  • 你是对的。抱歉重复,我自己遇到了那个话题,读了两遍,但没看懂。您的答案对于初学者来说更容易理解。
  • 我有同样的问题,上面提到的修复并没有解决它。这很奇怪,因为它可以在我的本地机器上运行,但当我将它部署到 centos7 服务器时却不行。两种设置的唯一区别是我的本地机器使用 Tomcat 8.0.23 而服务器使用 8.0.36,任何帮助将不胜感激
【解决方案2】:

我遇到了同样的问题并通过使用 tomcat7-websocket.jar 而不是 javax.websocket-api.jar 解决了它。使用这个依赖:

或者将tomcat7-websocket.jar放在/usr/share/tomcat7/lib/中

【讨论】:

    【解决方案3】:

    我遇到了相同的症状,但原因不同,提出这个问题的人可能希望了解这些症状。当服务器部署在 AWS 中时,一切都在本地运行良好,但在 tomcat 中失败了 404,并且出现了与此问题相同的错误消息。问题原来是在 AWS 中,我的 Web 套接字通过 ProxyPass 指令通过 Apache httpd 前端。

    <Location "/myApp">    
        AuthType Basic
        AuthName "Authorized Users Only"
        AuthBasicProvider file
        AuthUserFile "/usr/local/secure/htpasswd/passwords"
        Require user my_user
        ProxyPass http://localhost:8080/myApp
        ProxyPassReverse http://localhost:8080/myApp
    </Location>
    

    但是,这导致请求在传递给 tomcat 时变成了 http:// 请求而不是 ws:// 请求。

    解决方案是编写一个更具体的Location,仅涵盖 websocket。

    <Location "/myApp/socket">    
        AuthType Basic
        AuthName "Authorized Users Only"
        AuthBasicProvider file
        AuthUserFile "/usr/local/secure/htpasswd/passwords"
        Require user my_user
        ProxyPass ws://localhost:8080/myApp/socket
        ProxyPassReverse ws://localhost:8080/myApp/socket
    </Location>
    

    【讨论】:

      【解决方案4】:

      我被这个问题困扰了好几天。

      我使用的是tomcat7. 我尝试将 jars 添加到 jvm,但没有意义。

      最后,我升级到tomcat8.5 link here 并像魅力一样工作!

      【讨论】:

        猜你喜欢
        • 2015-12-10
        • 2017-07-17
        • 2019-05-03
        • 1970-01-01
        • 1970-01-01
        • 2016-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多