【发布时间】:2017-03-15 18:07:39
【问题描述】:
我正在尝试在我正在开发的嵌入式 Jetty 应用程序中测试 WebSocket 支持。我的目标是将数据从服务器流式传输到浏览器。我还没有解决所有问题,因为我刚刚开始设置 WebSocket servlet/handler。
我看到的问题是 Chrome 无法连接到 WebSocket 处理程序:
WebSocket 连接到“ws://127.0.0.1:8081/stream”失败:WebSocket 握手期间出错:意外响应代码:404 (匿名)@ws-test.js:1
HTTP 404 来自 Jetty,因为它没有向“/stream”注册任何内容。
对于我的生活,我无法弄清楚如何使用指定的 URL 设置 WebSocketServlet 或 WebSocketHandler。我已经阅读了我能找到的所有示例和教程,但其中很多不是嵌入式 Jetty,或者是旧的。无论哪种情况,我都愿意犯错。
我将从一些代码开始。这是我的服务器上下文和处理程序的主要 Jetty 设置:
ResourceHandler resource_handler = new ResourceHandler();
resource_handler.setWelcomeFiles(new String[] { "index.htm" });
resource_handler.setResourceBase('./www');
ServletHandler servletHandler = new ServletHandler();
HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[] { resource_handler, servletHandler, new DefaultHandler() });
server.setHandler(handlers);
// Add the /test servlet mapping
servletHandler.addServletWithMapping(TestServlet.class, "/test/*");
// Add websocket handler
handlers.addHandler(StreamingHandler.getServlet("/stream"));
server.start();
这是我扩展 WebSocketHandler 的 StreamingHandler 类。请注意,我正在尝试设置 WebSocketHandler 的上下文路径。重点是让 WebSocket 处理与http://127.0.0.1:8081/stream 的通信:
@WebServlet
public class StreamingHandler extends WebSocketHandler
{
public static ContextHandler getServlet(String url) {
ContextHandler ctxHandler = new ContextHandler();
ctxHandler.setContextPath(url);
ctxHandler.setHandler(new StreamingHandler());
return ctxHandler;
}
protected StreamingHandler() {
super();
}
@Override
public void configure(WebSocketServletFactory factory)
{
factory.getPolicy().setIdleTimeout(10000);
factory.register(StreamingSocket.class);
}
}
这是我的基本 WebSocket 类:
@WebSocket
public class StreamingSocket {
@OnWebSocketClose
public void onClose(int statusCode, String reason) {
System.out.println("Close: statusCode=" + statusCode + ", reason=" + reason);
}
@OnWebSocketError
public void onError(Throwable t) {
System.out.println("Error: " + t.getMessage());
}
@OnWebSocketConnect
public void onConnect(Session session) {
System.out.println("Connect: " + session.getRemoteAddress().getAddress());
try {
session.getRemote().sendString("Hello!");
} catch (IOException e) {
e.printStackTrace();
}
}
@OnWebSocketMessage
public void onMessage(String message) {
System.out.println("Message: " + message);
}
}
终于有点便宜的 Javascript 了。我不会包含基本的 HTML。它只是引用了这个 JS:
var ws = new WebSocket("ws://127.0.0.1:8081/stream");
ws.onopen = function() {
alert("Opened!");
ws.send("Hello Server");
};
ws.onmessage = function (evt) {
alert("Message: " + evt.data);
};
ws.onclose = function() {
alert("Closed!");
};
ws.onerror = function(err) {
alert("Error: " + err);
};
感谢任何提示。谢谢。
【问题讨论】:
标签: javascript java jetty java-websocket