做网络编程的人对setSoTimeout方法一定很熟悉,都知道是设置连接的超时时间!
但是我在网上找资料时发现很多人把这个超时时间理解成了链路的超时时间!我看了一下JDK 关于这个方法的说明,其实根本不是链路的超时时间!
其实说白了他只是read方法的超时时间,这个方法是堵塞的!
写个小例子验证一下:
服务端,收到一个请求后处理,但是只处理一个请求,处理完毕后结束:
第一个客户端,连接后一直保持连接对象的存活,但是不发送数据,服务端打印:
打印如下,可以看到链路一直是活的,间隔超时时间的间隔就打印一组异常信息:
然后我们编写一个客户端,连接后马上关闭连接,也不发送任何数据:
package socket;import java.net.Socket;public class Client {public static void main(String[] args) {try {Socket socket = new Socket("192.168.9.155", 30001);socket.setKeepAlive(true);} catch (Exception e) {e.printStackTrace();}}}
打印如下:
异常是不一样的,不一样的还有,如果是超时,则五秒钟循环一次,然后是连接中断,则不在循环马上再报错,因为连接已经挂了!但是打印这个连接还是有效的,这个我也不知道怎么回事!
所以,如果大家理解为超时时间内没有数据连接就自动关闭或失效,那么这个理解就非常有问题了!