Notice
Recent Posts
Recent Comments
Link
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Archives
Today
Total
관리 메뉴

ki-sd 님의 블로그

[2026-04-10] Socket 통신과 멀티 쓰레드를 활용한 실시간 다중 채팅 서버 본문

JavaStudy

[2026-04-10] Socket 통신과 멀티 쓰레드를 활용한 실시간 다중 채팅 서버

ki-sd 2026. 4. 17. 21:32

한 달여간 배운 OOP, 컬렉션, I/O 스트림, 예외 처리, 멀티 쓰레드를 총망라하여 실제 동작하는 네트워크 기반 채팅 애플리케이션을 완성했다.

 

1. TCP/IP 소켓 프로그래밍의 원리

  • 클라이언트의 연결 요청을 지정된 포트(Port)에서 끝없이 대기하는 ServerSocket과, 실제 클라이언트와 연결되어 1:1 데이터 스트림 터널을 뚫어주는 Socket의 역할을 완벽히 분리하여 설계했다.

2. 멀티 쓰레드 기반의 서버 아키텍처

  • 서버가 한 클라이언트의 메시지 수신(I/O)을 대기하는 동안 멈춰버리면(Blocking), 다른 클라이언트의 접속이나 메시지를 처리할 수 없다.
  • 이를 해결하기 위해 새로운 클라이언트가 접속할 때마다 해당 소켓을 담당하는 새로운 쓰레드를 생성하여 할당했다. 각 쓰레드가 독립적으로 동작하므로 다수의 사용자가 동시에 메시지를 주고받는 실시간 비동기 통신이 가능해졌다.

3. 동기화(Synchronization)와 브로드캐스팅(Broadcasting)

  • 접속한 모든 클라이언트의 출력 스트림 객체를 컬렉션(예: ArrayList 또는 HashMap)에 담아 중앙 관리했다.
  • 한 클라이언트가 보낸 메시지를 리스트에 있는 모든 클라이언트에게 일제히 뿌려주는 브로드캐스팅 로직을 구현했다.
  • 이때 여러 쓰레드가 동시에 컬렉션 데이터(공유 자원)에 접근하여 요소를 추가/삭제하면 충돌(ConcurrentModificationException)이 발생하므로, synchronized 키워드를 통해 특정 블록에 한 번에 하나의 쓰레드만 접근할 수 있게 잠금(Lock)을 거는 동기화 처리의 중요성을 깊이 깨달으며 전체 네트워크 시스템 구축을 마무리했다.