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