我想用websockets創建javaee應用程序,但無法讓程序正常工作。使用Tomcat 7,帶有websockets的Java EE 7應用程序。Websocket不工作:意外的響應代碼404
這裏是我的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);
我得到:
WebSocket連接到WS://本地主機:8080/MyApp的/你好失敗: 意外性反應代碼:404
我錯過了在網絡的東西。 XML或其他地方?
在'@ ServerEndpoint'的URL相對於servlet的根,但我沒有看到任何地方,你把servlet放在'myapp'下面。 'ws:// localhost:8080/hello'是否工作? – chrylis
@chrylis不,我沒有試過它 – maximus
我對WebSockets並不熟悉,但我認爲問題在於您沒有一個「WebSocketServlet」,它是端點的「所有者」,並且您的端點班級沒有連接到任何地方。 – chrylis