연습용 플젝_소켓 통신 구현하기

2025. 3. 20. 10:31웹프로그래밍

처음으로 구현한 소켓 통신...

여차저차 굴러가게만 하는 것이 목표였기에 부족함이 많다.

우선 굴러간다는 것에 의의를 두고 블로그를 작성하겠다.

 

 

GitHub - belovelace/prj_chat

Contribute to belovelace/prj_chat development by creating an account on GitHub.

github.com

 


WebSocket 서버의 핵심 기능

클라리언트가 웹소켓 서버에 연결 요청

클라이언트가 로컬 서버로 연결 시도

Config 클래스에서 handler 가 요청 처리

연결 완료시 afterConnectionEstablished() 메서드가 실행

registry.addHandler(new WebSocketHandler(), "/ws/chat").setAllowedOrigins("*");

클라리언트가 메세지를 보냄

클라이언트(웹소켓)이 JSON 메세지를 서버로 보냄

handleTextMessage()에서 메시지를 받아서 처리

Jackson 라이브러리를 사용해 JSON을 WebSocketVo 객체로 변환

이후 모든 클라이언트에게 메시지를 브로드캐스트

@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
    String json = message.getPayload();
    log.info("[수신 메세지]: {}", json);

    try {
        // JSON → WebSocketVo 변환
        WebSocketVo chatMessageVo = objectMapper.readValue(json, WebSocketVo.class);
        log.info("역직렬화된 메시지: {}", chatMessageVo);

        // 모든 클라이언트에게 메시지 전송 (브로드캐스트)
        String broadcastJson = objectMapper.writeValueAsString(chatMessageVo);
        TextMessage broadcastMessage = new TextMessage(broadcastJson);
        for (WebSocketSession wsSession : sessions) {
            wsSession.sendMessage(broadcastMessage);
        }
    } catch (Exception e) {
        log.error("메시지 처리 중 오류 발생", e);
    }
}

다른 클라이언트가 메세지 수신

첫 번째 클라이언트가 메시지를 보내면, 같은 웹소켓에 연결된 모든 클라이언트가 해당 메시지를 받음.

sessions에 저장된 모든 WebSocket 세션에 메시지를 전송하기 때문

 

for (WebSocketSession wsSession : sessions) {
    wsSession.sendMessage(new TextMessage(broadcastJson));
}

 

연결 종료는 클라이언트가

클라이언트가 웹소켓 연결을 끊으면 afterConnectionClosed()가 실행

해당 클라이언트의 세션을 sessions 리스트에서 제거

@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
    sessions.remove(session); // 세션 제거
    log.info("[연결 종료] Session ID: {}, Close Status: {}", session.getId(), status);
}


흐름 정리 (PostMan 테스트 기준)

 

1️⃣ 클라이언트(Postman)에서 ws://localhost:8088/ws/chat에 WebSocket 연결 요청
2️⃣ WebSocketHandler에서 연결 수락 → sessions 리스트에 세션 저장
3️⃣ 클라이언트 1이 메시지 전송 → handleTextMessage()에서 JSON 메시지 수신
4️⃣ 서버가 메시지를 역직렬화 후 sessions에 있는 모든 클라이언트에 메시지 전송
5️⃣ 클라이언트 2, 3, ...이 같은 메시지를 수신
6️⃣ 클라이언트가 연결을 종료하면 afterConnectionClosed()에서 세션 삭제

 

흐름 정리 (동작 기준_1:N 동작)

1️⃣ WebSocket 연결 (ws://localhost:8088/ws/chat)
2️⃣ 클라이언트가 JSON 메시지를 전송
3️⃣ 서버(WebSocketHandler)가 메시지를 받아서 모든 클라이언트에게 브로드캐스트
4️⃣ 모든 WebSocket 연결이 같은 메시지를 받음
5️⃣ 클라이언트가 연결 종료하면 서버에서 세션 정리

 

 

 

'웹프로그래밍' 카테고리의 다른 글

연습용 플젝_로그인 후 세션 유지  (1) 2025.03.04
연습용 플젝_채팅 웹사이트 만들기  (0) 2025.02.27
[css] flex  (0) 2025.02.04