我正试图在我的站点上实现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:火狐无法在ws://localhost:8080/Mysite/websocket端点上建立到服务器的连接Chrome:WebSocket握手时出错:意外响应代码: 404
我尝试使用‘ws://side.websocket.org’作为wsUri,它可以工作,所以我想问题在服务器端。
我使用以下库: javaee-api-7.0,javax.websocket-api-1.0我的浏览器与websockets兼容(我检查过)
类似的话题对我没有帮助,所以我要求你建议如何解决这个问题
发布于 2014-07-16 20:31:20
您可能需要检查这是否是错误的根源:tomcat 7.0.50 java webscoket实现提供404错误
自7.0.47版本以来,Tomcat有一个JSR-356 (即websocket )实现。它还提供了javax.websocket-api-1.0.jar库,因此在您的应用程序中不需要这个库。您可能在编译时需要它,但是服务器将在运行时提供它(如果您不熟悉这个工具,provided作用域在maven中就是这样的)
确保javax.websocket-api-1.0.jar没有在WAR中部署,在Eclipse视图中右击Clean...,然后是Clean Tomcat work directory...,然后是Publish,然后再试一次。
发布于 2015-05-23 02:50:09
我遇到了同样的问题,并通过使用tomcat7-websocket.jar而不是javax.websocket-api.jar解决了这个问题。使用此依赖关系:
或者将tomcat7 7-websocket.jar放在/usr/share/tomcat7 7/lib/
发布于 2016-12-10 03:17:59
我遇到了同样的症状,这些症状有着不同的原因,这是人们在这个问题上可能想要注意的。所有东西在本地都运行得很好,但是在tomcat中失败了404,当服务器部署在AWS中时,出现了与这个问题相同的错误消息。问题是,在AWS中,我的web套接字是通过ProxyPass指令通过Apache前端传递的。
<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>https://stackoverflow.com/questions/24779477
复制相似问题