Tomcat에서 WebSocket을 구현하는 방법
WebSocket 프로토콜은 HTML5 표준에 속하며 점점 더 많은 브라우저가 기본적으로 WebSocket을 지원하여 클라이언트와 서버가 양방향 통신을 달성 할 수 있도록합니다. 클라이언트와 서버간에 WebSocket 연결을 설정 한 후 서버 측 메시지를 클라이언트로 직접 전송하여 기존 요청 응답 모드를 중단하고 무의미한 요청을 피할 수 있습니다. 예를 들어, 기존 방식은 AJAX를 사용하여 서버 측을 지속적으로 요청할 수 있으며 WebSocket은 클라이언트에게 데이터를 직접 보낼 수 있으며 클라이언트는 요청할 필요가 없습니다. 동시에, 기본 브라우저 지원 덕분에 클라이언트 응용 프로그램 작성이 더욱 편리해졌으며 타사 플러그인에 의존 할 필요가 없습니다. 또한 WebSocket 프로토콜은 HTTP 프로토콜의 번거로운 요청 헤더를 포기하지만 더 효율적인 데이터 프레임 형태로 전송합니다.
그림은 WebSocket 프로토콜 통신 프로세스를 보여줍니다. 먼저, 클라이언트는 핸드 셰이크 패키지를 보내 서버에 WebSocket으로 업그레이드 할 것을 알려줍니다. 서버가 동의하는지 모르겠습니다. 현재 서버가 WebSocket 프로토콜을 지원하는 경우 핸드 셰이크 패키지를 반환하여 클라이언트에게 문제가없고 업그레이드가 확인되었다고 알려줍니다. 그런 다음 WebSocket 연결이 성공적으로 설정되어 양방향 통신을 지원하고 WebSocket 프로토콜의 데이터 프레임 형식을 사용하여 메시지를 보냅니다.
악수 과정을 설명해야합니다. WebSocket 프로토콜을 기존 HTTP 프로토콜 웹 아키텍처와 호환하려면 WebSocket 프로토콜의 핸드 셰이크는 HTTP 프로토콜을 기반으로해야합니다. 예를 들어, 클라이언트는 서버 요청과 유사한 HTTP 메시지를 WebSocket 프로토콜로 업그레이드하기 위해 보냅니다. 업그레이드 : WebSocket은 서버에 프로토콜을 업그레이드 할 것을 알려줍니다.
ws : // localhost : 8080/hello http/1.1 원산지 : http : // localhost : 8080 연결 : 업그레이드 호스트 : 로컬 호스트 : 8080 sec-websocket-key : urovsczjnol/umbtt5ukmw == 업그레이드 : Websocket Sec-websocket-Version : 13
현재 서버가 WebSocket 프로토콜을 지원하는 경우 클라이언트의 업그레이드 프로토콜에 동의하는 메시지를 보냅니다. 특정 메시지는 다음과 비슷합니다. 여기서 업그레이드 : WebSocket은 클라이언트에게 업그레이드 프로토콜에 동의한다고 말합니다.
HTTP/1.1 101 WebSocket 프로토콜 핸드 쉐이크 날짜 : FRI, 2016 년 2 월 10 일 17:38:18 GMT 연결 : 업그레이드 서버 : Kaazing Gateway 업그레이드 : Websocket SEC-WebSocket-Accept : RLHCKW/SKSO9GAH/ZSFHBATDKRU =
위와 같이 핸드 셰이크를 완료 한 후 HTTP 프로토콜 연결이 끊어집니다. 다음으로 WebSocket 프로토콜을 사용하여 두 당사자간에 통신합니다. 이 연결은 여전히 원래 TCP/IP 연결이며 포트는 여전히 원래 80 또는 443입니다.
다음은 Tomcat에서 WebSocket을 작성하는 간단한 예입니다.
공개 클래스 hellowebsocketServlet websocketServlet {private static list <messageInbound> socketList = new ArrayList <MessageInbound> (); 보호 된 StreamInbound CreateWeBsocketInbound (String SubProtocol, httpservletrequest 요청) {return new WebSocketMessageInbound (); } public class webSocketMessageInbound는 messageInbound를 확장합니다. Socketlist.remove (this); } 보호 된 void onopen (wsoutbound outbound) {super.onopen (아웃 바운드); socketlist.add (this); } @override protected void onbinaryMessage (ByteBuffer Message)는 ioException {} @Override Protected Void void ontextMessage (charBuffer message)를 던졌습니다. ioexception {for (a MessageInbound MessageInbound : socketList) {charbufer buffer = charBuffer.wrap (메시지); wsoutbound outbound = messageinbound.getwsoutbound (); outbound.writetextMessage (버퍼); outbound.flush (); }}}}이 서블릿은 WebSocketServlet을 상속 한 다음 MessageInbound를 상속하는 WebSocketMessageInbound 클래스를 작성해야합니다. OnClose, Onopen, OnbinaryMessage 및 OnTextMessage를이 클래스로 채우려면 각 이벤트의 논리를 완성하십시오. WebSocket 연결이 설정되면 OnOpen이 호출되며 WebSocket이 닫히면 OnClose가 호출되며, 이진 모드에서 클라이언트 데이터를 수신 할 때 OnbinaryMessage가 호출되며 클라이언트 데이터가 텍스트 모드로 수신 될 때 호출됩니다. 위의 코드는 방송의 효과를 구현합니다.
위의 처리 로직에 따르면, Tomcat의 WebSocket 통합은 그리 어렵지 않습니다. 이는 요청을 처리 할 때 WebSocket 프로토콜 요청에 직면하면 특별 처리를 수행하고 연결을 유지하며 적절한 시간에 WebSocketServlet의 MessageInbound 메소드의 OnClose, OnePen, OnbinaryMessage 및 OnTextMessage를 호출합니다. WebSocket은 일반적으로 NIO 모드에서 사용하는 것이 좋습니다. NIO 모드 통합 WebSocket 프로토콜을보십시오.
그림과 같이, WebSocket의 클라이언트 연결을 수신기에 의해 수신하고 NioChannel 큐에 등록하는 경우, 폴러 구성 요소는 니코 채널이 처리되어 있는지 여부를 계속 놓아줍니다. 그렇다면 처리 파이프 라인을 통해 WebsocketServlet을 상속하는 서블릿으로 이동합니다. WebSocketServlet의 doget 메소드는 WebSocket 핸드 셰이크를 처리하고 Return Client에게 업그레이드 계약에 동의하도록 지시합니다. 나중에 Poller는 계속해서 관련 NioChannel을 벗어났습니다. WebSocket 프로토콜을 사용하는 파이프 라인이 사용되었다는 것이 발견되면 MessageInbound 메서드를 호출하여 다양한 이벤트의 처리를 완료하여 WebSocket 프로토콜을 지원합니다.
읽어 주셔서 감사합니다. 도움이되기를 바랍니다. 이 사이트를 지원 해주셔서 감사합니다!