2014-10-17 1 views
1

Java 소켓을 사용하는 클라이언트 - 서버 응용 프로그램이 있습니다. 지금까지는 다음과 같은 방식으로 작동합니다.Java : 소켓 연결 풀 설정

클라이언트가 서버에 소켓 연결을 엽니 다. 서버의 socketHandler 스레드는 새 소켓을 LinkedBlockingQueue에 넣습니다. 작업자 스레드는 대기열에서 소켓을 가져 와서 스트림에서 객체를 가져 와서 읽습니다 (클라이언트가 객체를 서버에 전송 함). 응답을 클라이언트에 다시 쓰고 소켓을 닫습니다.

하지만 연결을 열어 둘 수 있도록 연결 풀을 만들고 싶지만 여전히 LinkedBlockingQueud가 필요합니다.

새로운 아이디어는 큐에 넣고 openSocketQueue를 호출 한 다음 socketHandler 스레드 (또는 다른 스레드)가 openSocketQueue를 반복하고 데이터를 읽지 않고 새 데이터를 사용할 수 있는지 확인합니다.). 데이터를 사용할 수 있으면 대기열에서 소켓을 제거하고 LinkedBlockingQueue에 저장합니다. 작업자가 작업을 마친 후에 소켓은 닫히지 않고 openSocketQueue에 다시 놓습니다.

이것은 합리적입니까? 효율적인 방법으로 새 ​​데이터가 있는지 소켓 검사를 반복하는 방법은 무엇입니까?

그런데, 나는 이것을위한 시간이 없기 때문에 NIO로 바꿀 수 없습니다.

+0

NIO의 비동기 이점을 사용하지 않으려면이 옵션이 남아 있습니다. 소켓 만 사용하려는 경우입니다. netty, mina와 같은 다른 패키지도 도움이됩니다. "Reactor design pattern"을 사용하려면 위의 패키지가 도움이 될 것입니다. 그렇지 않으면 루핑에 의존해야합니다. –

+0

SO_REUSEADDR을 소켓과 함께 사용하면 어떨까요? – machinery

+0

'SO_REUSEADDR'은이 질문과 관련이 없습니다. – EJP

답변

2

당신은 완전히 혼란 스럽습니다.

new Socket()을 호출하는 대신을 호출하는 대신 연결 풀링이 구현됩니다. 대상 IP : 포트로 키가 지정된 모음을 볼 수 있습니다. 종료하는 대신 연결을 풀로 반환합니다. 풀에있는 소켓이 너무 오래 있었던 소켓을 닫는 스레드를 추가합니다. 15 초.

서버에서 필요한 것은 other thread에서 설명한 것처럼 EOS 때까지 읽기 요청을 반복하는 연결 당 스레드입니다. 이 중 available()/LinkedBlockingQueue 항목이 없습니다.