我正在学习使用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>
答案 0 :(得分:0)
404
与HTTP中的404
没有什么不同,这意味着在服务器上找不到您要访问的地址。在您的情况下,我认为它涉及/WebsocketDemo
部分。 /endpoint
在端点配置中可用,但缺少/WebsocketDemo
。也许您应该将WAR部署在Web应用程序中的/WebsocketDemo
下,或删除地址的这一部分。
答案 1 :(得分:0)
我已经解决了问题,
进入月食→项目→构建自动检查的项目,
我的项目每次都能正确运行。
使用websocket时不要放置其他jar文件,tomcat8,9在lib文件夹中有websocket jar。
感谢@sepehr GH,@ Al1