设置套接字操作的超时

时间:2011-02-11 13:52:00

标签: java sockets

创建套接字时:

Socket socket = new Socket(ipAddress, port);

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

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

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

5 个答案:

答案 0 :(得分:151)

使用Socket() constructorconnect(SocketAddress endpoint, int timeout) method代替。

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

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

从文档中引用

  

connect

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

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

     

<强>参数:

     

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

     

<强>抛出:

     

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

     

自:          1.4

答案 1 :(得分:41)

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

例如socket.connect(otherAddress, timeout)

socket.setSoTimeout(timeout)用于设置read()操作的超时。

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

答案 2 :(得分:18)

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

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

希望它有所帮助!

答案 3 :(得分:8)

由于UnknownHostException,您无法控制超时。这些是DNS计时。您只能在给定有效主机的情况下控制连接超时。上述答案均未正确解决这一问题。

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

编辑控制Java的DNS超时see this answer

答案 4 :(得分:5)

使用default constructor进行套接字,然后使用connect() method