2013-07-24 4 views
3

org.apache.catalina.websocket.WebSocketServlet을 사용하는 서블릿을 작성하려고합니다. websocket 채팅 예제를 찾았지만 websocket 서버 (이 서블릿에서 구현 됨)에 대한 수신 포트를 어떻게 지정할 수 있습니까? 예를 들어 포트 11337의 클라이언트 연결을 수신 대기해야합니다. 그러나 어떻게 표현할 수 있습니까?tomcat websocket 서블릿 수신 포트

public class TestServlet extends WebSocketServlet { 
    private static final Logger logger = LoggerFactory.getLogger(TestServlet.class); 

    public TestServlet() { 
     logger.error("Initializing TestServlet"); 
    } 

    @Override 
    protected StreamInbound createWebSocketInbound(String subProtocol, HttpServletRequest request) { 
     logger.error("New WS connection, subProtocol=" + subProtocol + ", request=" + request.getRequestURL()); 
     return new TestConnection(); 
    } 

    private class TestConnection extends MessageInbound { 

     @Override 
     protected void onBinaryMessage(ByteBuffer byteBuffer) throws IOException { 
      logger.error("onBinaryMessage"); 
     } 

     @Override 
     protected void onTextMessage(CharBuffer charBuffer) throws IOException { 
      logger.error("onBinaryMessage: " + charBuffer); 
      sendMessage("Test message"); 
     } 

     public void sendMessage(String message) { 
      WsOutbound outbound = this.getWsOutbound(); 
      CharBuffer cb = CharBuffer.wrap(message); 
      try { 
       outbound.writeTextMessage(cb); 
      } catch (IOException e) { 
       logger.error("failed to write outbound"); 
      } 
     } 
    } 
} 

어디서 나는 수신 대기 포트를 설정하는 방법 내가 찾을 수 없습니다 :

OK, 여기에 (간체) 코드입니다. 공식 websocket 설명서도 많은 도움이되지 않습니다.

그래서 서블릿 설정에서 어딘가에 설정할 수 있지만 어디서 찾을 수없는 것 같아요.

누구에게 아이디어가 있습니까?

+0

RFC6455에 따르면 클라이언트에서 소켓을 "열려면"HTTP 요청을해야합니다. 포트 번호는 사용되지 않습니다. – jalynn2

+0

@ jalynn2, 실제로 각 클라이언트에서 서버 (보안 및 비보안)에 두 개의 연결이 필요합니다. 이 연결은 하나의 서블릿에 의해 제공되어야합니다. 그래서 별도의 포트 (예 : 8443 및 8444)가 필요합니다. 클라이언트는 서버의 포트를 연결하도록 지정하는'libwebsockets' 라이브러리를 사용하여 C++로 구현됩니다. 대답은'server.xml'과'Connector' 엘리먼트 어딘가에 있다고 생각합니다. 그러나 그물에서 유용한 것을 찾을 수는 없습니다. – maverik

+0

실제로 Tomcat에서 실행 중이거나 Tomcat 클래스를 사용하여 자신의 서버를 작성하고 있습니까? –

답변

4

WebSocket은 HTTP 프로토콜을 통해 작동하도록 설계되었으므로 일반적인 TCP 소켓과는 다른 수신 대기 포트는 없지만 배포 된 것과 동일한 서버 포트를 사용합니다.

당신의 경우에는 tomcat 서버를 사용하는 경우 websocket은 통신을 위해 포트 8080 (명시 적으로 수정하지 않은 경우)을 사용할 수 있습니다. MessageInbound 클래스의 onOpen 및 onClose 메서드를 재정의하여 Connection established 및 connection close에 대한 알림을 가져와야 할 수 있습니다. 자세한 내용은 아래 샘플 코드를 참조하십시오.

public class IncomingMessageHandler extends MessageInbound { 

    private WsOutbound myoutbound; 
    public IncomingMessageHandler() { 

    } 

    @Override 
    public void onOpen(WsOutbound outbound) { 
     logger.info("Open Client."); 
     this.myoutbound = outbound; 
    } 

    @Override 
    public void onClose(int status) { 
     logger.info("Close Client.");   
    } 

    /** 
    * Called when received plain Text Message 
    */ 
    @Override 
    public void onTextMessage(CharBuffer cb) throws IOException { 

    } 

    /** 
    * We can use this method to pass image binary data, eventually ! 
    */ 
    @Override 
    public void onBinaryMessage(ByteBuffer bb) throws IOException { 

    } 

    public synchronized void sendTextMessage(String message) { 
     try { 
      CharBuffer buffer = CharBuffer.wrap(message); 
      this.getMyoutbound().writeTextMessage(buffer); 
      this.getMyoutbound().flush(); 

     } catch (IOException e) { 
     } 
    } 

    /** 
    * Set timeout in milliseconds, -1 means never 
    */ 
    @Override 
    public int getReadTimeout() { 
     return -1; 
    } 

    public WsOutbound getMyoutbound() { 
     return myoutbound; 
    } 
    public void setMyoutbound(WsOutbound myoutbound) { 
     this.myoutbound = myoutbound; 
    } 
}