创建套接字时:
Socket socket = new Socket(ipAddress, port);
它会引发异常,这是正常的,因为IP地址不可用。 (String ipAddress = "192.168.0.3"
和int port = 300
的测试变量。)
问题是:如何为该套接字设置超时?
当我创建套接字时,如何在获得UnknownHostException
之前缩短时间并使套接字超时?
答案 0 :(得分:151)
使用Socket()
constructor和connect(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。