WebSocket

mangez_js·2024년 12월 16일

Study

목록 보기
28/47

WebSocket

클라이언트와 서버 간의 양방향 통신을 가능하게 하는 프로토콜로, HTTP를 기반으로 연결을 초기화한 후, TCP 소켓 연결을 통해 지속적으로 데이터를 주고받을 수 있는 기술

특징

  1. 양방향 통신
  • 클라이언트와 서버가 실시간으로 데이터를 주고받을 수 있음
  1. 연결 유지
  • 한 번 연결이 이루어지면 지속적인 연결을 유지하므로 데이터 전송 시 별도의 HTTP 헤더를 포함할 필요가 없어 네트워크 오버헤드가 적음
  1. 저지연
  • 실시간성이 요구되는 애플리케이션에서 적합하며, 기존 HTTP 폴링 방식보다 효율적이고 지연 시간이 적음
  1. 기반 프로토콜
  • WebSocket은 HTTP를 통해 핸드셰이크를 수행한 후, TCP 기반의 통신으로 전환함

WebSocket VS HTTP

특징WebSocketHTTP
통신 방식양방향(Full Duplex)단방향(Request/Response)
연결 방식연결 유지요청-응답 후 연결 종료
프로토콜TCPTCP
용도실시간 데이터 전송정적 리소스 제공
효율성네트워크 오버헤드 낮음헤더 포함으로 오버헤드 있음

WebSocket Handler

WebSocket 연결을 관리하기 위한 서버 측 로직

  • 주요 역할 :
    ∘ 연결 설정 및 해제 관리
    ∘ 메시지 송수신 처리
    ∘ 에러 핸들링 및 인증

기본 동작 흐름

  1. 핸드셰이크(HandShake)
  • 클라이언트가 서버에 WebSocket 연결 요청을 보냅니다.
  • 서버가 요청을 승인하면 지속적인 WebSocket 연결이 설정됩니다.
  1. 메시지 처리
  • 서버는 클라이언트로부터 받은 메시지를 처리하고, 필요한 응답을 클라이언트에게 보냅니다.
  • 반대로, 서버도 클라이언트에게 데이터를 푸시할 수 있습니다.
  1. 연결 종료
  • 클라이언트 또는 서버에서 연결을 종료할 수 있습니다.
  • 네트워크 장애나 타임아웃이 발생하면 연결이 닫힐 수 있습니다.

    WebSocket Handler 구현

    public class WebSocketHandler extends TextWebSocketHandler {
    	// 활성화된 세션 목록
       private final CopyOnWriteArrayList<WebSocketSession> sessions = new CopyOnWriteArrayList<>();
       
       @Override
       public void afterConnectionEstablished(WebSocketSession session) throws Exception {
       	sessions.add(session);
           System.out.println("New Connection Established: " + session.getId());
       }
       
       @Override
       protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception{
       	System.out.println("Message Received: " + message.getPayload());
           
           // 수신된 메시지를 모든 연결된 세션에 브로드캐스트
           for(WebSocketSession webSocketSession : sessions) {
           	if(webSocketSession.isOpen()){
               	webSocketSession.sendMessage(new TextMessage("Client " + session.getId() + "says : " +message.getPayload()));
               }
           }
       }
       
       @Override
       public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception{
       	sessions.remove(session);
       	System.out.println("Connection closed: " + session.getId());    
       }
    }

0개의 댓글