Websocket 不工作:意外响应代码 404
Posted
技术标签:
【中文标题】Websocket 不工作:意外响应代码 404【英文标题】:Websocket not working: unexpected responce code 404 【发布时间】:2013-08-23 13:09:32 【问题描述】:我正在尝试使用 websockets 创建 javaee 应用程序,但是无法使程序正常工作。使用 Tomcat 7、带有 websockets 的 Java EE 7 应用程序。
这是我的java代码:
import javax.websocket.CloseReason;
import javax.websocket.EndpointConfig;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.RemoteEndpoint;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint(value="/hello")
public class EchoEndpoint
RemoteEndpoint.Async endpoint;
@OnOpen
public void open(Session session, EndpointConfig conf)
//Connection opened.
System.out.println("EchoEndpoint on open");
endpoint = session.getAsyncRemote();
@OnMessage
public void onMessage(Session session, String msg)
//Message received.
System.out.println("EchoEndpoint on message");
@OnError
public void error(Session session, Throwable error)
//Connection error.
System.out.println("EchoEndpoint on error");
@OnClose
public void close(Session session, CloseReason reason)
//Connection closed.
System.out.println("EchoEndpoint on close");
public void send(String string)
System.out.println("Send called to EchoEndpoint");
endpoint.sendText(string);
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app
version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
</web-app>
index.html:
<!DOCTYPE html>
<meta charset="utf-8" />
<title>WebSocket Test</title>
<script language="javascript" type="text/javascript">
var wsUri = "ws://localhost:8080/myapp/hello";
var output;
function init()
output = document.getElementById("output");
testWebSocket();
function testWebSocket()
websocket = new WebSocket(wsUri);
websocket.onopen = function(evt) onOpen(evt) ;
websocket.onclose = function(evt) onClose(evt) ;
websocket.onmessage = function(evt) onMessage(evt) ;
websocket.onerror = function(evt) onError(evt) ;
function onOpen(evt)
writeToScreen("CONNECTED");
doSend("WebSocket rocks");
function onClose(evt)
writeToScreen("DISCONNECTED");
function onMessage(evt)
writeToScreen('<span style="color: blue;">RESPONSE: ' + evt.data+'</span>');
//websocket.close();
function onError(evt)
writeToScreen('<span style="color: red;">ERROR:</span> ' + evt.data);
function doSend(message)
writeToScreen("SENT: " + message);
websocket.send(message);
function writeToScreen(message)
var pre = document.createElement("p");
pre.style.wordWrap = "break-word";
pre.innerHTML = message;
output.appendChild(pre);
window.addEventListener("load", init, false);
</script>
<h2>WebSocket Test</h2>
<div id="output"></div>
</html>
在客户端尝试执行时:
websocket = new WebSocket(wsUri);
我明白了:
到 ws://localhost:8080/myapp/hello 的 Websocket 连接失败: 意外响应代码:404
我是否遗漏了 web.xml 或其他地方的某些内容?
【问题讨论】:
@ServerEndpoint
中的 URL 是相对于 servlet 的根目录的,但我没有看到您将 servlet 放在 myapp
下的任何地方。 ws://localhost:8080/hello
有效吗?
@chrylis 不,我已经尝试过了
我不熟悉 WebSockets,但我认为问题在于您没有 WebSocketServlet
这是端点的“所有者”,并且您的端点类没有附加任何地方。
@chrylis 我正在阅读这份文档,其中没有提到任何关于 WebSocketServlet 的内容:docs.oracle.com/javaee/7/tutorial/doc/websocket.htm
@chrylis 原因是 java ee 7 和 tomcat 7 不兼容。应该使用 Tomcat 8..
【参考方案1】:
WebSocket 在 Tomcat 7 中通过扩展 WebSocketServlet 实现。但是在tomcat 8中引入了WebSocket 1.0 API。你的代码与Tomcat 7不兼容。请使用tomcat 8并尝试相同。
更新...
现在,正如@samael 所说,Tomcat7 支持 websocket
【讨论】:
WebSocket 1.0 现在可以在 Tomcat 7 中使用。仅在使用 Java 7 时适用于 7.0.47 及更高版本。不推荐使用旧的扩展WebSocketServlet
的方式。
准确了解哪些版本支持哪种解决方案会很棒。以上是关于Websocket 不工作:意外响应代码 404的主要内容,如果未能解决你的问题,请参考以下文章
Django:WebSocket 握手期间出错:意外的响应代码:500
websocket失败:WebSocket握手期间出错:意外响应代码:400