我有一个java服务器,需要与Web客户端实时通信。为了做到这一点,我嵌入了 Jetty 9。Jetty 将充当 Web 客户端的静态 Web 服务器以及 Websocket 服务器。根据我在网上找到的示例,静态页面处理程序和 WS 处理程序都通过同一路径提供服务。我不清楚如何让 jetty 从两条不同的路径为他们提供服务。我将不胜感激任何指点。这是我的代码
public static void main(String ...args) throws Exception {
Server server = new Server(8080);
ResourceHandler resource_handler = new ResourceHandler();
resource_handler.setDirectoriesListed(true);
resource_handler.setWelcomeFiles(new String[]{ "index.html" });
resource_handler.setResourceBase("./webapp");
WebSocketHandler wsHandler = new WebSocketHandler() {
@Override
public void configure(WebSocketServletFactory factory) {
factory.register(MyWebSocketHandler.class);
}
};
HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[] { resource_handler,wsHandler, new DefaultHandler() });
server.setHandler(handlers);
server.start();
server.join();
}
最佳答案
使用 ContextHandlerCollection
并将您的 WebSockets
包装在 ContextHandler
对象中。
ContextHandlerCollection contexts = new ContextHandlerCollection();
contexts.addHandler(new ContextHandler(wsFooHandler, "/foo"));
contexts.addHandler(new ContextHandler(wsBarHandler, "/bar"));
HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[] { resource_handler, contexts, new DefaultHandler() });
但是,将 ServletContextHandler
与 WebSocketUpgradeFilter
及其 addMapping
结合使用,可以让您以更强大的方式控制 Websocket 创建的内容。
示例:
public static void main(String... args) throws Exception
{
Server server = new Server(8080);
ServletContextHandler context = new ServletContextHandler();
context.setContextPath("/");
context.setWelcomeFiles(new String[] { "index.html" });
WebSocketUpgradeFilter filter = WebSocketUpgradeFilter.configureContext(context);
filter.addMapping(new ServletPathSpec("/foo/*"),new SingleWebSocketCreator(FooSocket.class));
filter.addMapping(new ServletPathSpec("/bar/*"),new SingleWebSocketCreator(BarSocket.class));
filter.addMapping(new ServletPathSpec("/*.ws"),new SingleWebSocketCreator(WsTypeSocket.class));
filter.addMapping(new RegexPathSpec("/chat/room/[a-zA-z_]*/public"),new SingleWebSocketCreator(ChatSocket.class));
// add your own non-websocket servlets
context.addServlet(HelloServlet.class,"/hello");
// Lastly, the default servlet for root content (serves up static content)
// It is important that this is last.
ServletHolder holderPwd = new ServletHolder("default", DefaultServlet.class);
holderPwd.setInitParameter("resourceBase","./webapp");
holderPwd.setInitParameter("dirAllowed","true");
context.addServlet(holderPwd,"/");
HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[] { context, new DefaultHandler() });
server.setHandler(handlers);
server.start();
server.join();
}
并且意外地遗漏了 SingleWebSocketCreator ...
public class SingleWebSocketCreator implements WebSocketCreator
{
private Class<?> endpoint;
public SingleWebSocketCreator(Class<?> websocketEndpoint)
{
this.endpoint = websocketEndpoint;
}
@Override
public Object createWebSocket(ServletUpgradeRequest req, ServletUpgradeResponse resp)
{
try
{
// new instance of endpoint for each upgrade
return endpoint.newInstance();
}
catch (InstantiationException | IllegalAccessException e)
{
// failure to instantiate can flow out
throw new RuntimeException(e);
}
}
}
关于java - 我在我的应用程序中嵌入了 jetty 以通过 websocket 进行通信,如何定义不同的路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28735750/