2010-07-02 3 views
1

ServerSocket을 사용하여 Java TCP/IP 서버를 구현하여 네트워크 소켓을 통해 클라이언트의 메시지를 수락합니다.PDA가 일시 중지 모드에서 ServerSocket에 대한 TCP 연결을 끊습니다.

PDA (WIFI 바코드 스캐너)의 클라이언트를 제외하고는 정상적으로 작동합니다. 서버와 PDA 사이에 연결이되어 있고 유휴 시간이 지난 후 PDA가 대기 (대기) 상태가되면 연결에 문제가 있습니다. pda를 다시 깨어 났을 때 , 나는 TCP 모니터에서 관찰자는 다른 포트와 두 번째 연결이 설정되어 수 있지만, 이전도 설립 유지 :

로컬 호스트 : 2000 REMOTEHOST : 처음 설립 4899 (연결)

로컬 호스트 : 2000 REMOTEHOST : 웨이크 업 후 4890 설립 (연결)

그리고 클라이언트가 이제 새 연결을 사용하지만 서버가 여전히 이전에 수신 지금처럼 통신이 작동하지 않습니다 - 서버가 메시지를받지 못합니다. 그러나 서버가 클라이언트에게 메시지를 보내면 클라이언트는 문제를 인식합니다 (SocketException : 연결 재설정을 수신하면 서버는 새로운 연결을 사용하고 그 동안 클라이언트가 보낸 모든 메시지가 한 번에 수신 됨) !

서버가 메시지를 보내려고 할 때 처음에는 네트워크 문제가 있음을 알았지 만 예외 나 예외는 없습니다. 어떻게이 문제에 적절하게 대처하여 새 연결을 사용할 수 있습니까? 설정이 끝나면 (그리고 이전 버전이 닫힌 경우)

답변

1

나는 서버는 다음과 같이 구성되어 있다고 생각한다. 구현의 관점에서 볼 때 가장 간단한 방법은 각 클라이언트에 대해 새 스레드를 시작하는 것입니다. 이 (가 가난한 확장 성이있다) 일반적으로 좋은 방법이 아니라 당신이 고객을 많이 기대하지 않고 그것을 감당할 수 있다면, 바로이 같은 서버 변경 : 보너스로 당신을

server_loop 
{ 
    client_socket = server_socket.accept() 
    StartClientThread(client_socket) 
} 

을 동시에 여러 클라이언트를 처리 할 수있는 능력을 얻습니다.

+0

thx, 그게 내 문제를 해결! –

1

서버가 오래되어서 연결이 끊어짐에 따라이를 깨닫게하려는 것입니다.

서버 측 소켓 (ServerSocket이 아닌 소켓 연결)에서 연결 시간 초과를 설정하여 특정 기간 후에 닫을 수 있습니까? 아마도 SO_TIMEOUT이 Socket에서 만료 된 후에 echo/keepalive 명령을 사용하여 연결이 여전히 양호한 지 테스트 할 수 있습니다.

server_loop 
{ 
    client_socket = server_socket.accept() 
    TalkToClientUntilConnectionCloses(client_socket) 
} 

나는 들어오는 연결과 병렬로 설정된 연결을 처리하기 위해 변경 것 : 당신의 설명에서