2010-11-23 2 views
0

우리는 원격 서버에 대해 영구 소켓 연결을 유지하는 Java 클라이언트를 보유하고 있습니다. 클라이언트는 15 초마다 DB 테이블을 폴링하고 새 항목이 있으면 직렬화하여 소켓에 씁니다.Java 소켓 클래스가 연결 상태와 관련하여 거짓입니다.

출력 스트림에 쓰기 전에 소켓 연결 상태가 양호한 지 확인하고 싶습니다. 특정 애플리케이션 로직에 대해 이러한 사전 점검은 예외를 포착하고 반응 적으로 다시 연결하는 것보다 간단합니다.

LOG.debug("Socket status: bound=" + _socket.isBound() + ", closed=" + _socket.isClosed() + ", connected=" + _socket.isConnected() + ", outputShutdown=" + _socket.isOutputShutdown() + ", inputShutdown=" + _socket.isOutputShutdown()); 

나는 잠시 내 네트워크 어댑터를 비활성화하고 다음 폴링 동안, 예상대로 기록하는 동안 예외가 발생했습니다

나는 나를 연결이 끊어 때 알릴 수있는 방법 코드 그림을 다음 사용 소켓에.

그러나, 디버그 문은 다음과 같은 인쇄 :

"Socket status: bound=true, closed=false, connected=true, outputShutdown=false, inputShutdown=false" 

내가 예상 true 또는 거짓에 연결되어 마감했다. 내가 얻는 실제 가치가 거짓말 인 것 같습니다.

소켓의 연결 상태를 안정적으로 확인할 수있는 방법이 있습니까?

+0

합니다. – barrowc

+0

그들은 거짓말이 아니며 단지 잘못 해석 한 것입니다. –

답변

1

자바 네트워크 프로그래밍은 다음과 보석 제공 :

"... 소켓이 현재 열려 있으면 말해을, 당신은 false를 반환()는, isConnected()가 true 및 isClosed 반환 확인해야합니다. 예를 들어 :

boolean connected = socket.isConnected() && ! socket.isClosed();" 

희망이 도움이 당신이`isOutputShutdown()`두 번이 아니라 확인`isInputShutdown()`에서 모두 확인하고 문제를하지만 샘플 코드에 관련이 확실하지

+0

좋은 답변이지만 올바른 TCP 종료를 보내지 않으면 피어가 연결이 끊어 질 수 있습니다. 이것은 흔하지도 대단히 드뭅니다. 따라서'connected'는 true 일지 모르지만 다음 소켓 작업은 실패합니다. 따라서 실패를 처리 할 수있는 메커니즘이 있어야합니다. 따라서 위의 코드는 코딩을 저장하지 않을 것입니다. –

+0

@ 그렉 : 당신 말이 맞습니다. 나는 Socket의 API 작성자가 Socket이 연결되어 있는지 여부를 분류하는 데 도움이되는 편리한 메소드를 제공하지 않기로 선택한 이유에 대해 궁금해한다. 그 동안 귀하의 답변으로 돌아 가세요! – Arvanem

+2

이것은 TCP가 응답을 제공 할 방법이 없기 때문입니다. 기본 전송이 정보를 제공 할 수없는 경우 API 위에 빌드 된 API가 없습니다. –

2

100 % 확신 할 수는 없지만 기반 BSD 소켓 API에는 실제로 TCP 스트림이 열려 있는지 여부를 결정하는 메커니즘이 없다는 것을 확신합니다. read() 또는 write()이 실패하면 스트림이 찢어 졌음을 알리는 매우 안정적인 방법입니다.

6

신중하게 Socket class Javadoc을 읽으십시오.

isConnected 소켓에 연결할 수 있으면 true입니다. 메소드 이름이 잘못된 이름 인 경우 hasConnected 인 경우 더 정확합니다.

소켓이 성공적으로 연결되면 사실이되고 그대로 유지됩니다. isBound에 대해서도 마찬가지입니다. 소켓 작업을 시도하고 실패를 확인해야합니다. 엘리엇 러스티 해롤드하여