WebSocket 404 错误

Posted

技术标签:

【中文标题】WebSocket 404 错误【英文标题】:WebSocket 404 error 【发布时间】: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中的项目名称,我不确定你在第二个问题中的意思。 【参考方案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 并像魅力一样工作!

【讨论】:

以上是关于WebSocket 404 错误的主要内容,如果未能解决你的问题,请参考以下文章

@ServerEndpoint(“/websocket”)404

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

WebSocket 连接到“ws://localhost:8080/”失败:WebSocket 握手期间出错:意外响应代码:404

Websocket @serverendpoint 404

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

未找到404的Spring websocket