2013-03-12 2 views
2

java 소켓에서 soTimeout을 설정하면 활성 피어 대 수동 피어의 동작이 어떻게됩니까? 예를 들어, 1 분의 readtimeout 값이 있고 파일 전송이 있고 5 분이 소요되면 readtimeout 예외가 발생합니까? 내게는 연결이 끊어 질 때 타임 아웃 예외를 얻는 것이 필요하다.java 소켓 시간 초과 동작

+0

'수동형 피어'는 무엇을 의미합니까? TCP의 'Passive'는 읽기 또는 읽기 타임 아웃이없는 수신 대기 소켓을 나타냅니다. – EJP

답변

3

soTimeout 설정은 소켓의 입력 스트림에서 읽는 작업에 명시 적으로 영향을줍니다. 호출자가 읽기 작업에 대해 시간 제한 블록을 정의 할 수 있다고 생각할 수 있습니다. Javadoc에서 setSoTimeout :

지정된 제한 시간 (밀리 초)으로 SO_TIMEOUT을 활성화/비활성화합니다. 이 옵션을 0이 아닌 시간 제한으로 설정하면이 소켓과 연결된 InputStream의 read() 호출은이 시간 () 만 차단합니다. 시간 초과가 만료되면 java.net.SocketTimeoutException이 발생하지만 Socket은 여전히 ​​ 입니다.

피어 투 피어의 경우, 피어가 read을 호출하지 않아서 타임 아웃이 발생하지 않습니다. 그러나 읽기 호출을 수행하면 호출은 soTimeout이 만료되기 전에 데이터를 반환해야합니다. 그렇지 않으면 SocketTimeoutException이 발생합니다.

+0

감사합니다. 단지 명확하게하기 위해, readtimeout을 1 분으로 설정하고 socket()에서 read()를 호출하면, 서버가 상대방에서 계속 쓰는 경우에도이 메서드는 예외를 throw합니다. 그게 맞습니까? – cacert

+0

@cacert - 반드시 그렇지는 않습니다. 타임 아웃은 * 클라이언트 측에서 차단 읽기가 얼마나 오랫동안 대기했는지에 따라 결정됩니다. 따라서 서버가 데이터를 쓰고 있지만 어떤 이유로 'soTimeout'이 올라 오기 전에 클라이언트 버퍼에 나타나지 않으면 예외가 발생합니다. 그러나 클라이언트가'read'가 제한 시간 전에 일부 데이터를 리턴하는 한 예외는 발생하지 않습니다 ***. – Perception

+0

좋습니다. 허용됩니다. 그렇다면 우리는 긴 시간이지만 활성 세션 (우리는 타임 아웃 지속 시간 전에 매번 데이터를 검색합니다)이 있으면 읽기 타임 아웃이 문제가되지 않는다는 것을 어떻게 든 비활성 세션과 관련이 있다고 말할 수 있다고 생각합니다. 고맙습니다. – cacert