Tomcat 구현 WebSocket 상세 소개

4759 단어 TomcatWebSocket
Tomcat 는 어떻게 WebSocket 을 실현 합 니까?
웹 소켓 프로 토 콜 은 HTML 5 표준 에 속 하고 점점 더 많은 브 라 우 저 들 이 웹 소켓 을 지원 하 며 클 라 이언 트 와 서버 가 양 방향 통신 을 실현 할 수 있 습 니 다.클 라 이언 트 와 서버 측 에 WebSocket 연결 을 만 든 후 서버 측 메 시 지 는 클 라 이언 트 에 직접 보 내 전통 적 인 요청 응답 모드 를 깨 뜨리 고 무의미 한 요청 을 피 할 수 있 습 니 다.예 를 들 어 전통 적 인 방식 은 AJAX 를 사용 하여 서버 측 에 계속 요청 할 수 있 고 WebSocket 은 클 라 이언 트 에 데 이 터 를 직접 보 낼 수 있 으 며 클 라 이언 트 가 요청 하지 않 아 도 된다.또한 브 라 우 저의 네 이 티 브 지원 이 있 기 때문에 클 라 이언 트 프로그램 을 작성 하 는 것 도 더욱 편리 해 지고 제3자 플러그 인 에 의존 할 필요 가 없습니다.또한 웹 소켓 프로 토 콜 은 HTTP 프로 토 콜 의 번 거 로 운 요청 헤 더 를 지양 하고 데이터 프레임 방식 으로 전송 해 효율 이 높다.
그림 은 WebSocket 프로 토 콜 이 통신 하 는 과정 입 니 다.먼저 클 라 이언 트 는 악수 패 키 지 를 보 내 서버 측 에 내 가 WebSocket 으로 업그레이드 하고 싶다 고 알려 줍 니 다.서버 측 이 WebSocket 프로 토 콜 을 지원 하면 악수 패 키 지 를 보 내 클 라 이언 트 에 게 문 제 를 묻 지 않 았 다 고 알려 주 고 업그레이드 가 확인 되 었 습 니 다.그리고 웹 소켓 연결 을 성공 적 으로 만 들 었 습 니 다.이 연결 은 양 방향 통신 을 지원 하고 웹 소켓 프로 토 콜 의 데이터 프레임 형식 으로 메 시 지 를 보 냅 니 다.

악수 과정 은 설명 이 필요 합 니 다.웹 소켓 프로 토 콜 이 기 존의 HTTP 프로 토 콜 웹 구조 와 호 환 될 수 있 도록 웹 소켓 프로 토 콜 의 악 수 는 HTTP 프로 토 콜 을 바탕 으로 해 야 합 니 다.예 를 들 어 클 라 이언 트 는 다음 과 같은 HTTP 메 시 지 를 서버 측 에 보 내 웹 소켓 프로 토 콜 로 업 그 레이 드 를 요청 합 니 다.그 안에 포 함 된 Upgrade:websocket 은 서버 측 에 제 가 프로 토 콜 을 업그레이드 하고 싶다 고 알려 주 는 것 입 니 다.

  GET ws://localhost:8080/hello HTTP/1.1
  Origin: http://localhost:8080
  Connection: Upgrade
  Host: localhost:8080
  Sec-WebSocket-Key: uRovscZjNol/umbTt5uKmw==
  Upgrade: websocket
  Sec-WebSocket-Version: 13
이때 서버 측 에서 WebSocket 프로 토 콜 을 지원 하면 클 라 이언 트 업그레이드 프로 토 콜 에 동의 하 는 메 시 지 를 보 냅 니 다.구체 적 인 메 시 지 는 다음 과 같 습 니 다.그 중에서 Upgrade:websocket 은 클 라 이언 트 에 게 내 가 당신 의 업그레이드 프로 토 콜 에 동의 한 다 는 것 을 알려 주 는 것 입 니 다.

 HTTP/1.1 101 WebSocket Protocol Handshake
  Date: Fri, 10 Feb 2016 17:38:18 GMT
  Connection: Upgrade
  Server: Kaazing Gateway
  Upgrade: WebSocket
  Sec-WebSocket-Accept: rLHCkw/SKsO9GAH/ZSFhBATDKrU=
위 에서 악 수 를 한 후에 HTTP 프로 토 콜 의 연결 이 깨 지고 이 어 지면 웹 소켓 프로 토 콜 로 쌍방 통신 을 시작 합 니 다.이 연결 은 원래 의 TCP/IP 연결 이 고 포트 도 원래 의 80 또는 443 입 니 다.
Tomcat 에서 WebSocket 을 만 드 는 간단 한 예 를 들 어 보 겠 습 니 다.

public class HelloWebSocketServlet extends WebSocketServlet {
  private static List<MessageInbound> socketList = new ArrayList<MessageInbound>();

  protected StreamInbound createWebSocketInbound(String subProtocol,HttpServletRequest request){
    return new WebSocketMessageInbound();
  }

  public class WebSocketMessageInbound extends MessageInbound{
    protected void onClose(int status){
      super.onClose(status);
      socketList.remove(this);      
    }
    protected void onOpen(WsOutbound outbound){
      super.onOpen(outbound);
      socketList.add(this);
    }
    @Override
    protected void onBinaryMessage(ByteBuffer message) throws IOException {

    }
    @Override
    protected void onTextMessage(CharBuffer message) throws IOException {
      for(MessageInbound messageInbound : socketList){
        CharBuffer buffer = CharBuffer.wrap(message);
        WsOutbound outbound = messageInbound.getWsOutbound();
        outbound.writeTextMessage(buffer);
        outbound.flush();        
      }
    }
  }
}

이 Servlet 는 웹 소켓 Servlet 을 계승 해 야 합 니 다.이 어 Message Inbound 를 계승 하 는 웹 소켓 Message Inbound 류 를 만 듭 니 다.이 클래스 에 onClose,onOpen,onBinary Message 와 onTextMessage 등 방법 을 채 우 면 각 이벤트 의 논 리 를 완성 할 수 있 습 니 다.그 중에서 onOpen 은 웹 소켓 연결 이 만 들 때 호출 되 고 onClose 는 웹 소켓 이 닫 힐 때 호출 됩 니 다.onBinary Message 는 Binary 방식 에서 클 라 이언 트 데 이 터 를 받 을 때 호출 되 고 onTextMessage 는 Text 방식 에서 클 라 이언 트 데 이 터 를 받 을 때 호출 됩 니 다.위의 코드 는 방송의 효 과 를 실현 했다.
위의 처리 논리 에 따 르 면 Tomcat 은 웹 소켓 에 대한 통합 이 그리 어렵 지 않 습 니 다.요청 을 처리 할 때 웹 소켓 프로 토 콜 요청 이 있 으 면 특수 처 리 를 하고 연결 을 유지 하 며 적당 한 시기 에 웹 소켓 Servlet 의 Message Inbound 의 onClose,onOpen,onBinary Message 와 onTextMessage 등 방법 을 호출 하 는 것 입 니 다.웹 소켓 은 일반적으로 NIO 모드 에서 사용 하 는 것 을 권장 하기 때문에 NIO 모드 통합 웹 소켓 프로 토 콜 을 보십시오.
그림 에서 보 듯 이 웹 소켓 의 클 라 이언 트 연결 이 수신 기 에 접 수 된 후 NioChannel 대기 열 에 등 록 된 경우 폴 러 구성 요 소 는 NioChannel 이 처리 해 야 하 는 지,있 으 면 처리 파 이 프 를 거 쳐 웹 소켓 Servlet 을 계승 한 Servlet 에 들 어가 면 웹 소켓 Servlet 의 doGet 방법 은 웹 소켓 악 수 를 처리 하고 클 라 이언 트 에 게 업그레이드 프로 토 콜 에 동의 하 는 것 을 알려 준다.앞으로 도 폴 러 는 계속해서 관련 NioChannel 을 번갈아 가면 서 웹 소켓 프로 토 콜 을 사용 하 는 파이프 가 발견 되면 Message Inbound 의 관련 방법 을 호출 하여 서로 다른 사건 의 처 리 를 완성 하여 웹 소켓 프로 토 콜 에 대한 지원 을 실현 할 것 이다.

읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기