java-server websocket失败:WebSocket握手期间出错:意外的响应代码:404

时间:2018-06-24 01:32:19

标签: java tomcat websocket server

我正在学习使用tomcat在Java中创建Web套接字服务器,

但是当我运行带有示例代码的tomcat9.0时,

我总是在chrome开发人员工具响应中收到以下错误。

 **web socket failed: Error during WebSocket handshake: Unexpected response code: 404**

我查询了很多参考文献,但仍然无法解决问题,

我使用的是tomcat9.0&jre 1.8.0,我引用了blog

我创建的服务器代码(项目->新建-> Servlet文件)是

 package idv.yu;

 import java.io.IOException;
 import javax.websocket.OnClose;
 import javax.websocket.OnError;
 import javax.websocket.OnMessage;
 import javax.websocket.OnOpen;
 import javax.websocket.Session;
 import javax.websocket.server.ServerEndpoint;

 @ServerEndpoint(value = "/endpoint")
 public class MyWebsocket {

    @OnOpen
    public void onOpen(Session session) {
        System.out.println("onOpen::" + session.getId());
    }

    @OnClose
    public void onClose(Session session) {
        System.out.println("onClose::" + session.getId());
    }

    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println("onMessage::From=" + session.getId() + "      Message=" + message);

        try {
            session.getBasicRemote().sendText("Hello Client " +      session.getId() + "!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @OnError
    public void onError(Throwable t) {
        System.out.println("onError::" + t.getMessage());
    }
 }

我的项目树结构如下:

enter image description here

在我的chrome开发人员工具中,我设置了代码

 class WebSocketClient {

     constructor(protocol, hostname, port, endpoint) {

         this.webSocket = null;

    this.protocol = protocol;
    this.hostname = hostname;
    this.port     = port;
    this.endpoint = endpoint;
}

getServerUrl() {
    return this.protocol + "://" + this.hostname + ":" + this.port + this.endpoint;
}

connect() {
    try {
        this.webSocket = new WebSocket(this.getServerUrl());

        // 
        // Implement WebSocket event handlers!
        //
        this.webSocket.onopen = function(event) {
            console.log('onopen::' + JSON.stringify(event, null, 4));
        }

        this.webSocket.onmessage = function(event) {
            var msg = event.data;
            console.log('onmessage::' + JSON.stringify(msg, null, 4));
        }
        this.webSocket.onclose = function(event) {
            console.log('onclose::' + JSON.stringify(event, null, 4));                
             }
             this.webSocket.onerror = function(event) {
                 console.log('onerror::' + JSON.stringify(event, null, 4));
             }

         } catch (exception) {
             console.error(exception);
         }
     }

     getStatus() {
         return this.webSocket.readyState;
     }
     send(message) {

         if (this.webSocket.readyState == WebSocket.OPEN) {
             this.webSocket.send(message);

         } else {
             console.error('webSocket is not open. readyState=' + this.webSocket.readyState);
         }
     }
     disconnect() {
         if (this.webSocket.readyState == WebSocket.OPEN) {
             this.webSocket.close();

         } else {
             console.error('webSocket is not open. readyState=' + this.webSocket.readyState);
         }
     }
 }

最后我在下面设置了命令:

 var client = new WebSocketClient('ws', '127.0.0.1', 8080, '/WebsocketDemo/endpoint');
 client.connect();

但是我得到了错误:

enter image description here

有人知道如何解决此问题吗?

“ web.xml”是否必须设置任何内容?

我的web.xml是默认值,并且我检查了项目在库中是否有websocket-api.jar文件。 enter image description here

非常感谢您。

-编辑-

我的以下WebContent / Web-INF / web.xml内容:

 <?xml version="1.0" encoding="UTF-8"?>
 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      xmlns="http://xmlns.jcp.org/xml/ns/javaee"      xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID"      version="3.1">
   <display-name>WebsocketDemo</display-name>
   <welcome-file-list>
     <welcome-file>index.html</welcome-file>
     <welcome-file>index.htm</welcome-file>
     <welcome-file>index.jsp</welcome-file>
     <welcome-file>default.html</welcome-file>
     <welcome-file>default.htm</welcome-file>
     <welcome-file>default.jsp</welcome-file>
   </welcome-file-list>
 </web-app>

2 个答案:

答案 0 :(得分:0)

websocket中的

404与HTTP中的404没有什么不同,这意味着在服务器上找不到您要访问的地址。在您的情况下,我认为它涉及/WebsocketDemo部分。 /endpoint在端点配置中可用,但缺少/WebsocketDemo。也许您应该将WAR部署在Web应用程序中的/WebsocketDemo下,或删除地址的这一部分。

答案 1 :(得分:0)

我已经解决了问题,

进入月食→项目→构建自动检查的项目,

我的项目每次都能正确运行。

使用websocket时不要放置其他jar文件,tomcat8,9在lib文件夹中有websocket jar。

感谢@sepehr GH,@ Al1