2012-09-13 4 views
10

매우 힘든 과정을 호출하려고합니다. 평균 작업 시간은 9 ~ 10 분으로 계산됩니다.자바 : 소켓 읽기 타임 아웃 예외

java.net.SocketTimeoutException: Read timed out

내가 엉망으로 시도 : 99999999

2 분 후, 나는 다음과 같은 오류를 얻을 : 나는 프로세스를 실행하고있을 때

, 나는 엄청나게 많은 수의 제한 시간을 설정 그것 좀 더, 그리고 3000으로 시간 제한을 설정하고 3 초 후 예상과 같은 오류가있어.

socket.setSoTimeout(99999999)이 최대 120000으로 설정되는 이유에 대해 알고 계십니까?

+3

이 방법은 OS로 전달되므로이 방법의 동작은 사용중인 OS에 따라 다릅니다. 어떤 OS 버전을 사용하고 있습니까? –

+1

연결 유지 메시지를 보내려고 했습니까, 아니면 소켓을 오래 보관하는 대신 프로세스가 완료되면 "호출"할 수 있었습니까? – Thor84no

+1

OS가 범위를 벗어나기 때문에 OS가 사용자의 가치를 거부하는 것처럼 보입니다. 높은 값으로 연주하려고 시도하지만 너무 높지는 않습니다 (27 시간 이상으로 설정). v.g., 3 분, 5 분, 10 분. – SJuan76

답변

2

동일한 문제가 있었으며 소켓에 마지막으로 데이터를 읽거나 쓸 때까지는 해결책이 socket.shutdownInput(); socket.shutDownOutput();이 아니 었습니다. 이로써 소켓은 FIN_WAIT 상태가되어 닫히기 2 분 전에 기다린다. 그것에 대해 자세히 알아보십시오 this post

+0

이 기술은 읽기 타임 아웃 예외를 해결할 수 없습니다. – EJP

+0

테스트 케이스를 실행하는 데 시간이 걸렸다면 이것이 해결책이라고 생각했을 것입니다. 그리고 당신은 스스로 시도 할 수 있고 소켓에 입력을 써서'shutdownInput'을 사용하면 소켓이 FIN_WAIT 상태로 바뀌는 것을 볼 수 있습니다. 2 분 정도 기다리면 소켓이 닫혀있는 것을 볼 수 있습니다. – Rotem

+1

감사합니다. Rotem, that worked! :) – Urbanleg

1

난 내가 대답을 향상시킬 수 있습니다, 응용 프로그램이 어떻게 작동하는지 모르겠지만, 당신은 당신의 전화에 대한 자세한 정보를 제공하는 경우 무한 timeout to the socket

public void setSoTimeout(int timeout) 
       throws SocketException 

Enable/disable SO_TIMEOUT with the specified timeout, in milliseconds. With this option set to a non-zero timeout, a read() call on the InputStream associated with this Socket will block for only this amount of time. If the timeout expires, a java.net.SocketTimeoutException is raised, though the Socket is still valid. The option must be enabled prior to entering the blocking operation to have effect. The timeout must be > 0 . A timeout of zero is interpreted as an infinite timeout.

을 설정하려고합니다.

+0

나는 시간 제한을 0으로 설정하려고 시도했다. (무한 시간으로 가정) 그러나 다시 120 초 후에 예외를 던진다. – Urbanleg

+0

연결되어있는 동안 버퍼가 데이터를 읽습니까? 내 서버의 주소가 네트워크에서 올바르게 해석되지 않을 가능성이 있기 때문에 서버가 연결에 응답하고 있습니까? 로컬인지, VPN인지 또는 원격 서버인지는 알 수 없습니다. 주소가 netbios 쿼리 또는 호스트 파일 또는 원격 DNS를 사용하여 해결되었는지 여부를 알 수 없습니다. 주소가 잘못된 주소로 이어질 수 있습니다. –

+0

서버가 로컬입니다. 2 분 미만 걸릴 그것은 잘 작동합니다. – Urbanleg

2

분명히 당신이 설정하고 있다고 생각하는 시간 초과를 설정하지 않았거나 다른 사람이 나중에 변경하려고합니다. 더 많은 설명을하려면 몇 가지 코드를 게시해야합니다. TCP/IP 예시 권 II, # 174에서 W.R. 스티븐스에있어서, 상기 타임 아웃를 1000Hz 수로 짧은 유지된다

참고 틱 때문에 11분 이후 타임 아웃이 가능하지 않다. 이것은 BSD 코드에 적용됩니다.

+0

@downvoter 설명해주십시오. 스티븐스와 동의하지 않습니까? – EJP