Java核心技术·卷Ⅱ:高级特性(原书第10版)
上QQ阅读APP看书,第一时间看更新

4.1.3 套接字超时

从套接字读取信息时,在有数据可供访问之前,读操作将会被阻塞。如果此时主机不可达,那么应用将要等待很长的时间,并且因为受底层操作系统的限制而最终会导致超时。

对于不同的应用,应该确定合理的超时值。然后调用setSoTimeout方法设置这个超时值(单位:毫秒)。

如果已经为套接字设置了超时值,并且之后的读操作和写操作在没有完成之前就超过了时间限制,那么这些操作就会抛出SocketTimeoutException异常。你可以捕获这个异常,并对超时做出反应。

另外还有一个超时问题是必须解决的。下面这个构造器:

会一直无限期地阻塞下去,直到建立了到达主机的初始连接为止。

可以通过先构建一个无连接的套接字,然后再使用一个超时来进行连接的方式解决这个问题。

如果你希望允许用户在任何时刻都可以中断套接字连接,请查看4.3节。

java.net.Socket 1.0

·Socket()1.1

创建一个还未被连接的套接字。

·void connect(SocketAddress address)1.4

将该套接字连接到给定的地址。

·void connect(SocketAddress address,int timeoutInMilliseconds)1.4

将套接字连接到给定的地址。如果在给定的时间内没有响应,则返回。

·void setSoTimeout(int timeoutInMilliseconds)1.1

设置该套接字上读请求的阻塞时间。如果超出给定时间,则抛出一个Interrupted-IOException异常。

·boolean isConnected()1.4

如果该套接字已被连接,则返回true。

·boolean isClosed()1.4

如果套接字已经被关闭,则返回true。