2011-11-10 5 views
1

Java 응용 프로그램이 소켓 서버에 메시지 (멀티 스레드)를 보내야합니다. 응용 프로그램은 약 100-200 개의 메시지를 초당 보낼 수 있습니다.Java 소켓 클라이언트 패턴

이 작업을 수행하는 데 더 효과적인 방법을 알고 싶습니다.

  1. 단일 클라이언트 소켓을 열고이 소켓 하나를 통해 모든 스레드의 메시지를 보냅니다. 단점 : 연결 실패시 재 연결 논리를 처리해야하며 재 연결이 진행 중일 때 많은 메시지가 손실 될 수 있습니다. 스레드 안전, 차단 ??
  2. 각 스레드에 대한 새 클라이언트 소켓 연결을 만들고 보낸 후 닫습니다. 단점 : 소켓을 닫더라도 포트는 TIME_WAIT 시간까지 대기합니다.

어느 것이 더 실용적인 접근법입니까?

답변

3

3을 제안합니다. 스레드 당 소켓을 열고 스레드 풀 (예 : 스레드 풀을 통해)을 다시 사용하십시오. 그런 다음 스레드 내부의 재 연결을 처리하거나 올바르게 처리하고 새 스레드를 만듭니다. 이렇게하면 블로킹 및 동기화 문제를 피할 수 있습니다.

+0

그러나 OS가이 권한을 사용합니까? 고정 된 포트 번호 (예 : 65000)를 가지고 있으며이 풀의 포트를 다시 사용합니다. Y는 마이크로 레벨에서 같은 것을 구현해야합니까? – Dunxton

+0

OS 오픈 뉴스 소켓을 가지고있는 것이 현명하므로 기존의 것을 계속 사용하고 재사용하는 것이 가장 좋습니다 (새 Socked 열기는 서버와 Hanshaking을 의미 함) –

1

초당 100-200 개의 메시지가 그리 많지 않습니다. 비용이 많이 들기 때문에 매번 다시 연결하지 않을 것입니다. 연결을 다시 사용하면 훨씬 빨라집니다.

메시지가 손실 될 염려가있는 경우 메시지 묶음을 한 번에 하나씩 보내고받은 서버의 확인을 기다릴 수 있습니다. 이런 식으로 초당 수천 개의 메시지를 보낼 수 있습니다.

+0

100-200 개의 프로세스, 각각 3 개의 연결을 생성하므로 실제로 약 600 소켓입니다 연결은 1 초. 아파치 MINA 나 Jboss netty 같은 NIO 프레임 워크는 어떻습니까? 그들은 도울 것인가? 내가 재접속이나 스레드 대기/차단을 할 여유가 없기 때문에 나는 풀링에 약간의 관심이있다. 내가 보내는 실시간 데이터 여야합니다. 게다가 소켓 클라이언트 만 쓸 수 있습니다. 대상은 데이터를 일괄 적으로 읽을 수 없습니다. – Dunxton

+0

연결 당 하나의 메시지를 보내는 것은 매우 비효율적입니다. 오버 헤드는 기존 연결을 다시 사용하는 것보다 1000 배 이상 높습니다. 또한 서버에 막대한 부담을 안겨줍니다. 조심하지 않으면 리소스가 부족해질 수 있습니다. 실제로 매회 다시 연결해야하는 경우 실험을 통해이를 결정할 수있는 한계가 무엇인지 결정해야하며 클라이언트를 공동으로이 속도로 제한해야합니다. 서버를 관리하는 서버를 관리하는 사람을 설득하려고 시도하거나 서버를 종료 한 경우 알려줄 필요가 있다고 경고하는 것이 좋습니다. –