WebSocket 404错误

时间:2014-07-16 11:20:53

标签: tomcat java-ee websocket

我试图在我的网站上实施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兼容(我检查过)

类似的主题对我没有帮助,所以我要求你提供有关如何解决问题的建议

4 个答案:

答案 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)

我好几天都遇到了这个问题。

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

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