【问题标题】:Can i run WebAppContext with WebSocketHandler in same instance?我可以在同一个实例中使用 WebSocketHandler 运行 WebAppContext 吗?
【发布时间】:2014-07-05 00:54:45
【问题描述】:

可以同时运行 WebSocketHandler 和 WebAppContext 吗?我正在使用最新版本9.2.1.v20140609。我在下面尝试了配置,但是在 Websocket 调用 localhost:8080/ WebAppContext 时会拦截调用。这是我的启动器:

public static void main(String[] args) throws Exception
{
    ServerConnector connector = new ServerConnector(server);
    connector.setPort(8080);
    server.addConnector(connector);

    WebAppContext context = new WebAppContext("webapp", "/");

    // Setting up browser caching. Binds params for org.eclipse.jetty.servlet.DefaultServlet.init()
    context.getInitParams().put("org.eclipse.jetty.servlet.Default.etags", "true");
    context.getInitParams().put("org.eclipse.jetty.servlet.Default.cacheControl", "public, max-age=0");

    // Fix for Windows, so Jetty doesn't lock files
    if (System.getProperty("os.name").toLowerCase().contains("windows")) {
        context.getInitParams().put("org.eclipse.jetty.servlet.Default.useFileMappedBuffer", "false");
    }

    // Will throw an exception when will be unable to start server for some reason
    context.setThrowUnavailableOnStartupException(true);

    Broker broker = new Broker();

    // Implementation of org.eclipse.jetty.websocket.server.WebSocketHandler
    WebSocketHandler socketHandler = new com.namespace.websocket.Handler(broker);

    HandlerCollection handlerCollection = new HandlerCollection();
    handlerCollection.setHandlers(new Handler[] {context, socketHandler});

    server.setHandler(handlerCollection);

    // Remove Server:Jetty(9...) from Response Headers
    removeServerVersionFromHeaders(server);

    server.start();

}

我可以从启动器运行多个 jetty 实例并将 WebSocket 处理程序连接到某个 5555 端口,但最好我想保留一个 Jetty 实例,并且可能使用 /ws 处理程序来管理 WebSocket 连接

【问题讨论】:

    标签: java configuration websocket jetty jetty-9


    【解决方案1】:

    怎么样:

    public class Websock {
      private static class Adapter extends WebSocketAdapter {
        @Override
        public void onWebSocketConnect(Session sess) {
          System.out.print("client connected");
        }
      }
    
      public static void main(String[] args) throws Exception {
        Server server = new Server(8080);
    
        WebAppContext context = new WebAppContext("webapp", "/");
        context.getServletHandler().setEnsureDefaultServlet(false); // may or may not be needed.
    
        ContextHandlerCollection handlerCollection = new ContextHandlerCollection();
        handlerCollection.addHandler(context);
        handlerCollection.addHandler(createWebsocketHandler());
    
        server.setHandler(handlerCollection);
    
        server.start();
      }
    
      private static ContextHandler createWebsocketHandler() {
        ContextHandler contextHandler = new ContextHandler("/ws");
        contextHandler.setAllowNullPathInfo(true); // disable redirect from /ws to /ws/
    
        final WebSocketCreator webSocketcreator = new WebSocketCreator() {
          public Object createWebSocket(ServletUpgradeRequest request,
              ServletUpgradeResponse response) {
            return new Adapter();
          }
        };
    
        Handler webSocketHandler = new WebSocketHandler() {
          public void configure(WebSocketServletFactory factory) {
            factory.setCreator(webSocketcreator);
          }
        };
    
        contextHandler.setHandler(webSocketHandler);
        return contextHandler;
      }
    }
    

    ContextHandlerCollection 看起来像你想要的,需要一点时间来习惯将码头处理程序链接在一起。

    如果您不需要 WebAppContext 的功能,那么您也可以将其删除,直接使用 ContextHandlers。

    我自己没有运行过这个,但看起来差不多。

    【讨论】:

      【解决方案2】:

      @Andrew, 我接受你的回答。代码有效,但是当您连接到 /ws 时,它会抛出 302,它将您重定向到 /ws/,因此请连接到 /ws/

      var ws = new WebSocket("ws://localhost:8080/ws");
      WebSocket connection to 'ws://localhost:8080/ws' failed: Error during WebSocket handshake: Unexpected response code: 302
      
      var ws = new WebSocket("ws://localhost:8080/ws/");
      

      我在jetty-users 社区中被警告过,我在那里问过类似的question,因为没有人回答。他们建议我用另一种方式做,但我会尝试这两种方法,很快就会在这里回复。

      编辑:决定坚持使用WebSocketServlet,并将其映射到现有的WebAppContext

      【讨论】:

      猜你喜欢
      • 2016-02-17
      • 2010-09-16
      • 2011-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多