![Java核心技术·卷Ⅱ:高级特性(原书第10版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/937/34339937/b_34339937.jpg)
上QQ阅读APP看书,第一时间看更新
4.1.3 套接字超时
从套接字读取信息时,在有数据可供访问之前,读操作将会被阻塞。如果此时主机不可达,那么应用将要等待很长的时间,并且因为受底层操作系统的限制而最终会导致超时。
对于不同的应用,应该确定合理的超时值。然后调用setSoTimeout方法设置这个超时值(单位:毫秒)。
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/195-i.jpg?sign=1738813110-VaZrh36NyHKC77uHU6kbW7QmePPToedS-0-8335478c98c77a752238d9ff372f7f73)
如果已经为套接字设置了超时值,并且之后的读操作和写操作在没有完成之前就超过了时间限制,那么这些操作就会抛出SocketTimeoutException异常。你可以捕获这个异常,并对超时做出反应。
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/195-2-i.jpg?sign=1738813110-BB10Uqf5fl9xag5cNm50D9e79qDe2Tmk-0-63f99015151e9b899e677773f1bb05ec)
另外还有一个超时问题是必须解决的。下面这个构造器:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/195-3-i.jpg?sign=1738813110-iGl70PvFTQ6MD4S9Naq9y0oHsoRsUYJT-0-fcb914c8a4417cab39d67d9423dbdd98)
会一直无限期地阻塞下去,直到建立了到达主机的初始连接为止。
可以通过先构建一个无连接的套接字,然后再使用一个超时来进行连接的方式解决这个问题。
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/195-4-i.jpg?sign=1738813110-mLo3t7TV49OBTm8cG9jZ0xfpDSmMSzHl-0-08e18cacf596d7b38f2d032dc04c549a)
如果你希望允许用户在任何时刻都可以中断套接字连接,请查看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。