我试图在我的网站上实施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://本地主机:8080 / MYSITE / websocketendpoint
Chrome
:WebSocket握手期间出错:意外的响应代码: 404
我尝试使用&#39; ws://echo.websocket.org'如wsUri
并且它有效,所以我猜问题出在服务器端。
我使用以下库: javaee-api-7.0,javax.websocket-api-1.0 我的浏览器与websockets兼容(我检查过)
类似的主题对我没有帮助,所以我要求你提供有关如何解决问题的建议
答案 0 :(得分:8)
您可能想要检查这是否是您的错误的根源:tomcat 7.0.50 java webscoket implementation gives 404 error
自7.0.47版以来,Tomcat有一个JSR-356(即websocket API)实现。它还提供javax.websocket-api-1.0.jar
库,因此您的应用程序不需要这样做。您可能在编译时需要它,但服务器将在运行时提供它(如果您不熟悉该工具,那就是provided
范围在maven中的含义)
确保未在WAR中部署javax.websocket-api-1.0.jar
,在Eclipse服务器视图中右键单击Clean...
,然后Clean Tomcat work directory...
,然后Publish
,然后重试
答案 1 :(得分:1)
我遇到了同样的问题并使用tomcat7-websocket.jar而不是javax.websocket-api.jar解决了这个问题。使用此依赖关系:
&lt; dependency org =&#34; org.apache.tomcat&#34;名称=&#34; tomcat7-的WebSocket&#34;转=&#34; 7.0.52&#34; /&GT;
或将tomcat7-websocket.jar放在/ usr / share / tomcat7 / lib /
中答案 2 :(得分:0)
我遇到了同样的一系列症状,这些症状有不同的原因,登陆这个问题的人可能想知道。一切都在本地工作很好,但在tomcat中404失败,并且在AWS中部署服务器时出现与此问题相同的错误消息。问题是,在AWS中,我的Web套接字通过ProxyPass指令传递到Apache httpd前端。
http://
但是,这会导致请求在传递给tomcat时变为ws://
请求而不是Location
请求。
解决方案是编写一个更具体的<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>
,仅覆盖websocket。
{{1}}
答案 3 :(得分:0)