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 |