有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用同一端口(使用jetty 8)使WebSocket具有多个上下文

我试图实现websocket服务器,要求在同一端口上有多个上下文,即

ws://ip:8989/provider1
ws://ip:8989/provider2 

应在同一端口上提供两个不同的连接

我按照旧文章How do I create an embedded WebSocket server Jetty 9?创建了上下文处理程序

我尝试在下面的代码中创建两个独立的上下文

ContextHandler context = new ContextHandler();
context.setContextPath("/provider1");
context.setHandler(wsHandler);
server.addHandler(context);
ContextHandler context = new ContextHandler();
context.setContextPath("/provider2");
context.setHandler(wsHandler);
server.addHandler(context);
server.start();
server.join();

但我只得到第二个上下文的数据。这是正确的实现吗

即使我让它工作,我有最终的要求,我必须在运行中打开/创建上下文,即在使用第一个上下文启动服务器之后

有人能解释一下如何使用单端口实现这些要求吗


共 (1) 个答案

  1. # 1 楼答案

    您的问题是Jetty 8服务器类中只能有一个处理程序,因为没有addHandler

    处理程序是一个包装类,可以像matryoshka玩偶一样进行配置。这是创建一个处理程序集合(HandlerCollection),并在这里放置两个上下文处理程序。此类具有addHandler方法

    代码如下

    // Collection 
    HandlerCollection hc = new HandlerCollection();
    
    // First context
    ContextHandler context = new ContextHandler();
    context.setContextPath("/provider1");
    context.setHandler(wsHandler);
    hc.addHandler(context)
    
    // Second context
    ContextHandler context2 = new ContextHandler();
    context2.setContextPath("/provider2");
    context2.setHandler(wsHandler2);
    hc.addHandler(context2)
    
    
    server.setHandler(hc);
    server.start();
    server.join();