为套接字操作设置超时
当我创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()方法 。