java tcp socket 关闭_初步探究java中程序退出、GC垃圾回收时,socket tcp连接的行为...

初步探究java中程序退出、GC垃圾回收时,socket tcp连接的行为

今天在项目开发中需要用到socket tcp连接相关(作为tcp客户端),在思考中发觉需要理清socket主动、被动关闭时发生了什么,所以做了一番实验,验证socket tcp连接在调用close、被GC回收、程序运行完毕退出、程序进程被杀掉时,tcp会产生什么行为。得出了一些结论,记录于此同时分享给大家。

先写出得到的结论:

java程序运行完毕退出和被杀进程时,socket tcp连接会被关闭。而且是通过发送RST方式关闭tcp,不是四次挥手方式关闭tcp,不会进入TIME_WAIT状态。(一般在关闭异常连接时,使用发出RST复位标志的方式)

在socket对象被GC回收时,socket的close()方法会被调用,此时将使用四次挥手方式关闭主动tcp连接,随后进入一段时间的TIME_WAIT状态。主动调用socket的close()方法效果相同。

在使用new Socket(host,port)创建socket对象后,便会建立起tcp连接。

以上结论是个人测试得到的,如果有出入欢迎指正。

PS:下方是new Socket(host,port)构造方法的代码,结合上面结论第3条,可见在构造方法中第40行进行了一些业务逻辑。联想到前段时间广泛传播的《阿里巴巴JAVA开发手册.pdf》文档,其中有这样一条:

11.【强制】构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在 init 方法中。

可见这个规则也不是处处适用的(至少此处jdk中Socket的构造方法就与这条规则相悖),在使用时考虑到团队协作、符合习惯等时考虑遵守这条规则。

1 /**

2 * Creates a stream socket and connects it to the specified port3 * number on the named host.4 *

5 * If the specified host is {@codenull} it is the equivalent of6 * specifying the address as7 * {@linkjava.net.InetAddress#getByName InetAddress.getByName}{@code(null)}.8 * In other words, it is equivalent to specifying an address of the9

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值