为套接字操作设置超时

当我创build一个套接字:

Socket socket = new Socket(ipAddress, port); 

它引发exception,这是正确的,因为IP地址不可用。 (testingvariables,其中String ipAddress = "192.168.0.3"int port = 300

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

当我创build套接字时,如何在获取UnknownHostException之前减less时间并使套接字超时?

使用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 

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

参数:

endpoint – SocketAddress
timeout – 以毫秒为单位的超时值。

抛出:

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

由于:1.4

您不要为套接字设置超时,而是为您在该套接字上执行的操作设置超时。

例如socket.connect(otherAddress, timeout)

或者在read()操作上设置超时的socket.setSoTimeout(timeout)

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

您可以使用以下解决scheme:

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

希望它有帮助!

由于UnknownHostException您无法控制超时。 这些是DNS时间。 您只能控制给定有效主机的连接超时。 前面的答案都没有正确解决这一点。

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

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

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