[WebSocket] WebSocket, SockJs

Barded·2023년 3월 10일
0

WebSocket

목록 보기
1/2
post-thumbnail

WebSocket

WebSocket이란?

  • WebSocket이란 기존의 단방향 HTTP 프로토콜과 호환되어 양방향 통신을 제공하기 위해 개발된 프로토콜
  • 일반 Socket과 달리 HTTP 80 Port를 사용하므로 방화벽에 제약이 없다.
  • 접속까지는 HTTP 프로토콜을 이용하고 그 이후는 자제적인 WebSocket 프로토콜로 통신하게 된다.

WebSocket 구현

WebSocketHandler

@Component
@Sl4j
public class ChatHandler extends TextWebSocketHandler {

    private static List<WebSocketSession> list = new ArrayList<>();

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        String payload = message.getPayload();
        log.info("payload : " + payload);

        for(WebSocketSession sess: list) {
            sess.sendMessage(message);
        }
    }

    /* Client가 접속 시 호출되는 메서드 */
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {

        list.add(session);

        log.info(session + " 클라이언트 접속");
    }

    /* Client가 접속 해제 시 호출되는 메서드드 */

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {

        log.info(session + " 클라이언트 접속 해제");
        list.remove(session);
    }
}

afterConnectionEstablished 메서드를 통해서 sessionlist에 넣고
afterConnectionClosed 메서드를 통해서 session을 제거한다.

WebSocketConfig

@Configuration
@RequiredArgsConstructor
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    private final ChatHandler chatHandler;

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
    
        registry.addHandler(chatHandler, "chat").setAllowedOrigins("*");
    }
}

@EnableWebSocket 애노테이션을 사용해 WebSocket을 활성화 하고
WebSocket에 접속하기 위한 Endpointschat으로 설정한다. 이 경우 ws://localhost:8080/chat으로 커넥션을 연결하고 메세지 통신을 할 수 있다.

SockJs

SockJs란?

모든 클라이언트의 브라우저에서 WebSocket을 지원한다는 보장이 없으므로 WebSocket Emulation을 이용하여 우선 WebSocket을 시도하고, 실패할 경우 HTTP Streaming, Long-Polling 같은 HTTP 기반의 다른 기술로 전환해 다시 연결을 시도하는 것을 말한다.

간단하게
.withSockJs() 한줄로 설정이 가능하다.

개발하는 고라니님의 블로그를 참고하였습니다.

profile
Now or Never

0개의 댓글