클라이언트와 서버 간의 양방향 통신을 가능하게 하는 프로토콜로, HTTP를 기반으로 연결을 초기화한 후, TCP 소켓 연결을 통해 지속적으로 데이터를 주고받을 수 있는 기술
| 특징 | WebSocket | HTTP |
|---|---|---|
| 통신 방식 | 양방향(Full Duplex) | 단방향(Request/Response) |
| 연결 방식 | 연결 유지 | 요청-응답 후 연결 종료 |
| 프로토콜 | TCP | TCP |
| 용도 | 실시간 데이터 전송 | 정적 리소스 제공 |
| 효율성 | 네트워크 오버헤드 낮음 | 헤더 포함으로 오버헤드 있음 |
WebSocket 연결을 관리하기 위한 서버 측 로직
- 주요 역할 :
∘ 연결 설정 및 해제 관리
∘ 메시지 송수신 처리
∘ 에러 핸들링 및 인증
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());
}
}