Tomcat 7.0.50 Java WebSocket 实现出现 404 错误。

10

我正在尝试在Tomcat 7.0.50上使用Java Websocket API(1.0)- JSR 356中指定的注释端点实现Websocket。以下是我编写它的简要步骤:

1)使用@ServerEndpoint注释编写Websocket端点。

2)实现@onOpen和@onMessage方法。

3)在Google Chrome上使用JavaScript打开Websocket。

请按顺序查找上述步骤对应的代码:

1)第1步和第2步 - 编写Websocket服务器端点:

        package com.jkweb.websocket;

       import java.io.IOException;
       import java.util.HashMap;
       import java.util.List;
       import java.util.Map;

       import javax.websocket.EndpointConfig;
       import javax.websocket.OnMessage;
       import javax.websocket.OnOpen;
       import javax.websocket.Session;
       import javax.websocket.server.PathParam;
       import javax.websocket.server.ServerEndpoint;

       import org.slf4j.Logger;
       import org.slf4j.LoggerFactory;

  @ServerEndpoint(value="/websocket/fileuploadtracker")

@OnOpen 
public void open(Session session,EndpointConfig config) {
    ......
}
@OnMessage
public void onMessage(Session session, String msg) {
    try {
        session.getBasicRemote().sendText(msg);
    } catch (IOException e) {
        logger.error(e.getMessage());
    }
}

public static void sendMessage(String uniqueTocken,String msg){
    try {
        Session wsSession = socketConnectionMap.get(uniqueTocken);
        wsSession.getBasicRemote().sendText(msg);
    } catch (IOException e) {
        logger.error(e.getMessage());
    }
}

}

2) 第三步 - 在Chrome中使用JavaScript API打开WebSocket:

      wsurl =  "ws://localhost:8080/jkweb/websocket/fileuploadtracker",
        ws; 
        ws = new WebSocket(wsurl);
         ws.onopen = function()
         {
            // Web Socket is connected, send data using send()
            ws.send("Sending first Message");
            alert("Message is sent...");
         };
         ws.onmessage = function (evt) 
         { 
            var received_msg = evt.data;
            alert("Message is received...");
         };
         ws.onclose = function(evt)
         { 
            // websocket is closed.
            alert("Connection is closed..."+evt.code + ":"+evt.reason ); 
         };        

我正在使用以下软件版本: 1) Tomcat - 7.0.50 2) Java - 1.7.45 3) Servlet - 3.0 4) 已包含以下Maven依赖项 5) Chrome - 32.0.1700.107m

     <dependency>
     <groupId>javax.websocket</groupId>
     <artifactId>javax.websocket-api</artifactId>
     <version>1.0</version>
         <scope>provided</scope>
</dependency>   

然而,我在Chrome控制台中遇到了以下错误,并且连接被关闭并显示1066错误代码:

      WebSocket connection to 'ws://localhost:8080/jkweb/websocket/fileuploadtracker' failed: Error during WebSocket handshake: Unexpected response code: 404

我是否漏掉了任何配置?我努力搜索了很多但都找不到。请帮我尽快解决。

3个回答

13

我已经解决了这个问题。问题非常特定于我的安装环境。我在我的应用程序的WEB-INF/lib目录中也安装了websocket api .jar。不确定为什么会导致出错。您能否对这种行为的根本原因以及为什么在将websocket-api.jar与tomcat的lib一起放在应用程序的WEB-INF/lib中时无法工作进行解释?


5
我也遇到了同样的问题,一旦我将依赖范围设置为 provided,就不再抛出 404 错误。可能是某些重复类的冲突或其他原因导致注释无法读取。 - Brian Antonelli
不是特定于您的安装,因为我也遇到了同样的问题。 - Kyrstellaine
对于第一次学习这个的人来说,解决这个问题是一个很大的痛苦 - 谢谢! - ash
1
非常感谢!Maven默认会打包websocket-api.jar,排除该jar文件将解决问题。 - zyanlu
3
我已经在我的问题中给出了正确和相关的Maven配置。要解决问题,请确保已为WebSocket API配置了“provided”作用域,并且您的Tomcat lib目录实际上包含websocket-api.jar。以下是再次提供给您的配置: javax.websocket javax.websocket-api 1.0 provided - Shailesh Vaishampayan
显示剩余4条评论

2

如果您使用的是在Eclipse中创建的Tomcat服务器,您应该删除旧服务器,并创建一个新的Tomcat 7.0.50服务器。这是我的解决方案。PS:我的Tomcat服务器版本是7.0.53,旧版本为7.0.21。祝您好运~


0

我也遇到了同样的问题。尝试移除$JAVA_HOME/lib文件夹中包含websocket的不必要的jar文件,然后只添加


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接