簡體   English   中英

我將jetty嵌入到應用程序中以通過websocket通信,如何定義不同的路徑?

[英]I'm embedding jetty in my app to communicate over websockets, how can define different paths?

我有一個Java服務器,它需要與Web客戶端實時通信。 為此,我要嵌入Jetty9。Jetty將充當Web客戶端以及websocket服務器的靜態Web服務器。 根據我在網上找到的示例,靜態頁面處理程序和WS處理程序都在同一路徑下使用。 我不清楚如何從兩個不同的途徑為他們服務。 我將不勝感激任何指針。 這是我的代碼

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);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM