티스토리 뷰

Java

1 : N 소켓 양방향 통신

yoooon1212 2024. 5. 24. 12:25

1 : N 소켓 양방향 통신에서는 하나의 서버가 여러 클라이언트와 동시에 양방향 통신을 할 수 있습니다. 이는 채팅 애플리케이션, 멀티플레이어 게임 서버 등에서 흔히 사용됩니다.

 

필요 개념

 

  1. 서버와 클라이언트 소켓:
    • 서버는 하나의 ServerSocket을 통해 여러 클라이언트의 연결 요청을 기다립니다.
    • 클라이언트는 각각의 Socket을 통해 서버에 연결을 요청하고, 연결된 후 서버와 통신합니다.
  2. 멀티스레딩:
    • 서버는 각 클라이언트와의 통신을 별도의 스레드에서 처리합니다. 이를 통해 여러 클라이언트와 동시에 통신할 수 있습니다.
    • 각 클라이언트는 서버와의 통신을 처리하는 자체 스레드를 가집니다.
  3. 동기화 및 자원 관리:
    • 여러 스레드가 동시에 데이터를 읽고 쓸 수 있으므로, 데이터의 일관성을 유지하기 위한 동기화가 필요합니다.
    • 서버는 연결된 클라이언트 소켓을 관리하고, 클라이언트가 연결을 끊을 때 자원을 적절히 해제해야 합니다.
  4. 데이터 송수신:
    • 서버와 클라이언트는 서로 데이터를 주고받을 수 있어야 합니다. 이를 위해 입력 스트림과 출력 스트림을 사용합니다.

 

< 1 : N 소켓 양방향 통신의 개념을 시각적으로 표현 >

 

<서버측 코드>

MultiClient

 

Vector 클래스는 자바의 java.util 패키지에 포함된 동기화된 리스트 구현체입니다. Vector는 동기화된 메서드를 제공하여 멀티스레드 환경에서 안전하게 사용할 수 있습니다. 그러나 이러한 동기화 메서드는 성능에 영향을 미칠 수 있습니다.

 

 

 

ConcurrentHashMap vs HashMap vs Hashtable

 

  1. HashMap
    • 비동기화된 맵 구현으로, 단일 스레드 환경에서 사용됩니다.
    • 스레드 안전하지 않기 때문에 멀티스레드 환경에서는 사용하면 안 됩니다.
  2. Hashtable
    • 동기화된 맵 구현으로, 모든 메서드가 동기화되어 있습니다.
    • 동기화 메서드 사용으로 인해 성능 저하가 발생할 수 있습니다.
  3. ConcurrentHashMap
    • 동시성 제어가 추가된 고성능 맵 구현입니다.
    • 내부적으로 세분화된 잠금을 사용하여 높은 동시성을 제공합니다.
    • 멀티스레드 환경에서 가장 적합한 선택입니다.

 

코드 예시)

사용법 확인

출력 결과

 

 

  • ConcurrentHashMap.newKeySet()은 내부적으로 ConcurrentHashMap을 사용하여 스레드 안전한 Set 을 생성합니다.
  • Set 은 여러 스레드가 동시에 접근하거나 수정할 수 있는 환경에서 안전하게 사용할 수 있습니다.
  • Set 의 모든 수정 연산은 내부적으로 ConcurrentHashMap의 동시성 제어 메커니즘을 사용하여 높은 성능과 스레드 안전성을 제공합니다.
Set<PrintWriter> clientWriters = ConcurrentHashMap.newKeySet();

일반적인 Set 자료 구조를 사용하는 것이 아니라, ConcurrentHashMap 의 특성을 지닌 스레드 안전한 Set 을 만드는 개념입니다. 이를 통해 ConcurrentHashMap의 내부 구조와 동시성 제어 메커니즘을 활용하여 높은 성능과 스레드 안전성을 갖춘 Set을 생성할 수 있습니다.

 

 

코드 예시)

클라이언트 생성

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/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
글 보관함