创建套接字时:
Socket socket = new Socket(ipAddress, port);
因为IP地址不可用,它会引发一个异常,这是可以的。(测试变量whereString ipAddress = "192.168.0.3"
和int port = 300
。)
问题是:如何将该套接字设置为超时?
创建套接字时,如何减少获取aUnknownHostException
并使套接字超时之前的时间?
创建套接字时:
Socket socket = new Socket(ipAddress, port);
因为IP地址不可用,它会引发一个异常,这是可以的。(测试变量whereString ipAddress = "192.168.0.3"
和int port = 300
。)
问题是:如何将该套接字设置为超时?
创建套接字时,如何减少获取aUnknownHostException
并使套接字超时之前的时间?
Answers:
使用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
使用指定的超时值将此套接字连接到服务器。零超时被解释为无限超时。然后,连接将被阻塞,直到建立或发生错误。
参数:
endpoint
-SocketAddress
timeout
要使用的超时值,以毫秒为单位。抛出:
IOException
-如果在连接期间发生错误
SocketTimeoutException
-如果超时在连接之前到期
IllegalBlockingModeException
-如果此套接字具有关联的通道,并且该通道处于非阻塞模式
IllegalArgumentException
-如果端点为null或此套接字不支持SocketAddress子类从:1.4
socket.setSoTimeout(timeoutMillis)
在阻止IO操作期间要求超时也很重要。
您没有为套接字设置超时,而是为在该套接字上执行的操作设置了超时。
例如 socket.connect(otherAddress, timeout)
或socket.setSoTimeout(timeout)
用于设置read()
操作超时。
参见:http : //docs.oracle.com/javase/7/docs/api/java/net/Socket.html
socket.setSoTimeout
必须将其称为AFTER connect
,否则它将无效并且读取将永远不会超时。这是一个文档不足的陷阱。
您可以使用以下解决方案:
SocketAddress sockaddr = new InetSocketAddress(ip, port);
// Create your socket
Socket socket = new Socket();
// Connect with 10 s timeout
socket.connect(sockaddr, 10000);
希望能帮助到你!
connect()
方法解决,但不在超时控制下。
使用默认的Socket构造函数,然后使用connect()方法。