簡體   English   中英

java-server websocket失敗:WebSocket握手期間出錯:意外的響應代碼:404

[英]java-server websocket failed: Error during WebSocket handshake: Unexpected response code: 404

我正在學習使用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());
    }
 }

我的項目樹結構如下:

在此處輸入圖片說明

在我的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();

但是我得到了錯誤:

在此處輸入圖片說明

有誰知道如何解決這個問題?

“ web.xml”是否必須設置任何內容?

我的web.xml是默認值,並且我檢查了項目在庫中有websocket-api.jar文件。 在此處輸入圖片說明

非常感謝你。

-編輯-

我的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>

404中的WebSocket是不是從任何不同404在HTTP,這意味着你要訪問的地址不能在服務器上找到。 在您的情況下,我認為它是關於/WebsocketDemo部分。 /endpoint在端點配置中可用,但缺少/WebsocketDemo 也許您應該將WAR部署在webapps的/WebsocketDemo下,或刪除地址的這一部分。

我解決了這個問題,

進入月食→項目→構建自動檢查項目,

我的項目始終運行正確。

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

謝謝@sepehr GH,@ Al1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM