设置套接字操作的超时

Jen*_*fer 83 java sockets

当我创建一个套接字时:

Socket socket = new Socket(ipAddress, port);
Run Code Online (Sandbox Code Playgroud)

它会引发异常,这是正常的,因为IP地址不可用.(测试变量where String ipAddress = "192.168.0.3"int port = 300.)

问题是:如何将其设置为该套接字的超时?

当我创建套接字时,如何在UnknownHostException获得套接字并使套接字超时之前减少时间?

aio*_*obe 157

请改用Socket()构造函数connect(SocketAddress endpoint, int timeout)方法.

在你的情况下,它看起来像:

Socket socket = new Socket();
socket.connect(new InetSocketAddress(ipAddress, port), 1000);
Run Code Online (Sandbox Code Playgroud)

引用文档

connect

public void connect(SocketAddress endpoint, int timeout) throws IOException
Run Code Online (Sandbox Code Playgroud)

使用指定的超时值将此套接字连接到服务器.超时为零被解释为无限超时.然后,连接将阻塞,直到建立或发生错误.

参数:

endpoint- SocketAddress
timeout- 要使用的超时值,以毫秒为单位.

抛出:

IOException- 如果在连接期间发生错误
SocketTimeoutException- 如果超时在连接之前到期
IllegalBlockingModeException- 如果此套接字具有关联的通道,并且通道处于非阻塞模式
IllegalArgumentException- 如果endpoint为null或者是此套接字不支持的SocketAddress子类

自:1.4

  • 这可以减少ConnectException的超时(但不会增加它),并且它对OP声称他得到的UnknownHostException的超时没有影响(虽然我不相信).另请注意,Javadoc在声明默认值为无穷大时不正确.事实并非如此.该平台的默认超时大约为一分钟,并且无法增加. (4认同)
  • 现在是5年后,这是我在互联网上找到的最佳答案..谢谢 (4认同)
  • 即使在4年后这也很有帮助,这应该是公认的答案. (3认同)

pay*_*yne 41

您没有为套接字设置超时,您为在该套接字上执行的操作设置了超时.

例如 socket.connect(otherAddress, timeout)

或者socket.setSoTimeout(timeout)用于设置read()操作超时.

请参阅:http: //docs.oracle.com/javase/7/docs/api/java/net/Socket.html

  • @sandos在Javadoc中明确说明了connect().但它也是不正确的.默认超时是平台超时,大约一分钟,而不是无限,并且只能通过此connect()方法减少,而不是增加. (3认同)
  • 注意,`socket.setSoTimeout` 必须在 `connect` 之后调用,否则不会有任何效果,并且读取永远不会超时。这是一个记录不足的陷阱。 (3认同)

ree*_*eef 19

您可以使用以下解决方案:

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

希望能帮助到你!


use*_*421 8

您无法控制超时UnknownHostException.这些是DNS计时.您只能在给定有效主机的情况下控制连接超时.前面的答案都没有正确地解决这一问题.

但是UnknownHostException当我指定IP地址而不是主机名时,我发现很难相信你真的得到了.

编辑要控制Java的DNS超时,请参阅此答案.


Sjo*_*erd 5

使用Socket 的默认构造函数,然后使用connect()方法.