2014-07-05 3 views
3

WebSocketHandler와 WebAppContext를 함께 실행할 수 있습니까? 최신 버전 9.2.1.v20140609을 사용하고 있습니다. 아래의 구성을 시도했지만 웹 소켓 호출시 localhost:8080/ WebAppContext 호출로 인터셉트합니다.동일한 인스턴스에서 WebSocketHandler를 사용하여 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(); 

} 

내가 실행 여러 부두 인스턴스에서 실행하고 일부 5555 포트에 바로 와이어 웹 소켓 핸들러, 바람직하게 내가 한 부두 인스턴스를 유지하고 싶은, 그리고 어쩌면 웹 소켓 연결을 관리 할 수 ​​/ws 핸들러를 사용할 수 있습니다 : 여기 내 실행기입니다 같은 것에 대해 어떻게

답변

4

:

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의 기능이 필요하지 않은 경우이를 제거하고 ContextHandler를 직접 사용할 수 있습니다.

나는 이걸 직접 달려 보지 않았지만 제대로 된 모양입니다.

0

@Andrew, 답변을 수락합니다. 코드가 작동하지만 /ws에 연결하면 302이 표시되어 /ws/으로 리디렉션되므로 /ws/에 연결합니다. 아무도 대답하지 않았다 때문에 내가 jetty-users 사회에서 이것에 대해 경고했습니다

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/"); 

, 난, 가지 유사한 question가 물었다. 그들은 내가 다른 방식으로 해보라고 제안하고 있지만 두 가지 방법을 모두 시도해보고 곧 답변을 남겨 둘 것입니다.

편집 :은/WS 수 있도록 WebSocketServlet 고수하고 WebAppContext 아 그래, 그것에 대해 잊고

+0

, 당신은 ContextHandler.setAllowNullPaths (true)를 사용할 수 있습니다 존재하는 매핑하기로 결정했다. http://download.eclipse.org/jetty/stable-9/apidocs/org/eclipse/jetty/server/handler/ContextHandler.html#setAllowNullPathInfo(boolean) – Andrew