소켓 작업에 대한 제한 시간 설정


87

소켓을 만들 때 :

Socket socket = new Socket(ipAddress, port);

IP 주소를 사용할 수 없기 때문에 괜찮은 예외가 발생합니다. (테스트 변수는 String ipAddress = "192.168.0.3"int port = 300.)

문제는 해당 소켓에 대한 시간 제한을 어떻게 설정합니까?

소켓을 만들 때 a UnknownHostException를 얻고 소켓이 시간 초과 되기 전에 시간을 어떻게 줄 입니까?


10
@adrianboimvaser :이 경우 중복으로 플래그를 지정하고 중복을 가리키는 댓글을 남겨 중재자가이를 닫을 수 있도록해야합니다 (1 년 전에 댓글을 남겼습니다. 지금 쯤이면 알 수 있습니다). 나는 지금 그것을하기 위해 내 투표를 할 것이지만, 나는 복제가 어디에 있는지 모른다!
Tom Anderson 2012 년

1
몇 년 늦게 회신하는 경향을 계속하기 위해 @EJP는이 질문의 제목이 귀하가 제안한 복제물보다 훨씬 덜 모호합니다
Isaac

@Isaac 그리고 사실 그것은 전혀 중복되지 않습니다. 댓글이 철회되었습니다.
Marquis of Lorne 2015 년

(참고 : 나는 조금도 덜 모호한 것으로 불통있다.)
스티븐 C

답변:


167

사용 Socket()생성자connect(SocketAddress endpoint, int timeout)방법 대신합니다.

귀하의 경우에는 다음과 같이 보일 것입니다.

Socket socket = new Socket();
socket.connect(new InetSocketAddress(ipAddress, port), 1000);

문서에서 인용

connect

public void connect(SocketAddress endpoint, int timeout) throws IOException

지정된 제한 시간 값을 사용하여이 소켓을 서버에 연결합니다. 0의 제한 시간은 무한 제한 시간으로 해석됩니다. 그러면 연결이 설정되거나 오류가 발생할 때까지 차단됩니다.

매개 변수 :

endpoint-SocketAddress-
timeout사용되는 제한 시간 값 (밀리 초).

던졌습니다 :

IOException-연결 중에 오류가 발생하는
SocketTimeoutException경우- 연결 전에 시간 초과가 만료 된
IllegalBlockingModeException경우-이 소켓에 연결된 채널이 있고 채널이 비 차단 모드 인
IllegalArgumentException경우-끝 점이 null이거나이 소켓에서 지원하지 않는 SocketAddress 하위 클래스 인 경우

이후 : 1.4


4
이것은 ConnectException에 대한 시간 제한을 줄일 수 있지만 (증가하지는 않음) OP가 받고 있다고 주장하는 UnknownHostException의 시간 제한에 영향을 미치지 않습니다 (믿지 않지만). 또한 기본값이 무한대임을 나타내는 Javadoc이 올바르지 않습니다. 그렇지 않습니다. 플랫폼의 기본 시간 제한은 약 1 분이며이 값은 늘릴 수 없습니다.
Marquis of Lorne

3
4 년이 지난 후에도 이것이 도움이되었지만 이것이 받아 들여진 대답이어야합니다.
Sharp Edge

4
5 년 만에 인터넷에서 찾은 최고의 답입니다 .. 감사합니다
MBH

1
socket.setSoTimeout(timeoutMillis)IO 작업을 차단하는 동안 시간 초과 를 호출 하는 것도 중요 합니다.
Gray

43

소켓에 대한 시간 제한을 설정하지 않고 해당 소켓에서 수행 하는 작업에 대한 시간 제한을 설정 합니다.

예를 들면 socket.connect(otherAddress, timeout)

또는 작업에 socket.setSoTimeout(timeout)대한 시간 제한을 설정합니다 read().

참조 : http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html


음,이 경우에는 연결하는 작업이기도합니다. 이 ctor가 무한한 시간 제한을 사용한다고 말하는 곳을 찾을 수 없습니다.
sandos

3
@sandos connect ()에 대한 Javadoc에 명확하게 명시되어 있습니다. 그러나 그것은 또한 부정확합니다. 기본 제한 시간은 플랫폼 제한 시간이며 무한대가 아닌 약 1 분이며이 connect () 메서드를 통해서만 줄일 수 있으며 증가 할 수는 없습니다.
Marquis of Lorne

참고 socket.setSoTimeoutAFTER 호출해야합니다 connect, 또는 아무런 영향이 없으며 시간이 초과하지 않습니다 읽는 것입니다. 이것은 제대로 문서화되지 않은 문제입니다.
pstanton

19

다음 솔루션을 사용할 수 있습니다.

SocketAddress sockaddr = new InetSocketAddress(ip, port);
// Create your socket
Socket socket = new Socket();
// Connect with 10 s timeout
socket.connect(sockaddr, 10000);

도움이 되었기를 바랍니다.


1
그가 주장하는 것처럼 그가 UnknownHostException을 받고 있다면, 그것은 수정 된 타임 아웃이 적용되지 않는 첫 번째 줄에서 일어날 것입니다.
Marquis of Lorne

그러나 첫 번째 줄에는 예외가 발생하지 않습니다. 문서에서 : "호스트 이름을 InetAddress로 확인하려고 시도합니다.이 시도가 실패하면 주소가 확인되지 않은 것으로 표시됩니다."
ady

이 경우 connect()메서드에 의해 해결 되지만 제한 시간이 제어되지는 않습니다.
Marquis of Lorne

8

(으)로 인해 시간 제한을 제어 할 수 없습니다 UnknownHostException. 이것은 DNS 타이밍입니다. 유효한 호스트가 주어지면 연결 시간 제한 만 제어 할 수 있습니다. 앞의 답변 중 어느 것도이 점을 올바르게 다루지 않습니다.

그러나 UnknownHostException호스트 이름이 아닌 IP 주소를 지정할 때 실제로 얻는 것이 믿기지 않습니다.

편집 Java의 DNS 시간 초과를 제어하려면 이 답변을 참조하십시오 .


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.