首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebSocket 404错误

WebSocket 404错误
EN

Stack Overflow用户
提问于 2014-07-16 11:20:52
回答 4查看 24.3K关注 0票数 3

我正试图在我的站点上实现WebSocket。下面是我添加的基本教程:

代码语言:javascript
复制
@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:

代码语言:javascript
复制
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兼容(我检查过)

类似的话题对我没有帮助,所以我要求你建议如何解决这个问题

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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,然后再试一次。

票数 9
EN

Stack Overflow用户

发布于 2015-05-23 02:50:09

我遇到了同样的问题,并通过使用tomcat7-websocket.jar而不是javax.websocket-api.jar解决了这个问题。使用此依赖关系:

或者将tomcat7 7-websocket.jar放在/usr/share/tomcat7 7/lib/

票数 1
EN

Stack Overflow用户

发布于 2016-12-10 03:17:59

我遇到了同样的症状,这些症状有着不同的原因,这是人们在这个问题上可能想要注意的。所有东西在本地都运行得很好,但是在tomcat中失败了404,当服务器部署在AWS中时,出现了与这个问题相同的错误消息。问题是,在AWS中,我的web套接字是通过ProxyPass指令通过Apache前端传递的。

代码语言:javascript
复制
<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。

代码语言:javascript
复制
<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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24779477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档