java - 我在我的应用程序中嵌入了 jetty 以通过 websocket 进行通信,如何定义不同的路径?

标签 java websocket jetty embedded-jetty

我有一个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() });

但是,将 ServletContextHandlerWebSocketUpgradeFilter 及其 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/

相关文章:

java -jar 无法从 list 文件读取类路径,导致 NoClassDefFoundError 错误

php - socket_recv 未收到完整数据

java - 带有 Jetty 的 Spring MVC - app-servlet.xml 文件中应该包含什么?

java - tomcat websocket servlet监听端口

http - 在 Go 中使用 HTTP 与使用 TCP 套接字将文件下载/上传到服务器有什么优势?

java - 为什么 HttpServletRequest 输入流是空的?

java - boolean 标志的 JAXB xmlelement 默认值

java - 正则表达式匹配单词结尾

java - 为什么相同的字体在从 Netbeans 运行的 Java 应用程序和从 Jar 运行的 Java 应用程序中看起来不同?

java - 在一个也使用aop的方法上使用spring的@Transactional :after advice