Skip to main content

Tio.remove()和Tio.close()的区别

Tio.remove()和Tio.close(),是初学者容易混淆的两个api,本文详细说明一下两者的区别

首先我们要明白一个概念,您用t-io,可能是用t-io做TCP服务器,也可能是用t-io做TCP客户端

Tio.remove

不管是用t-io做TCP服务器还是TCP客户端,调用Tio.remove()后,t-io都会彻底删除TCP连接并释放包括ChannelContext在内的所有和该条TCP连接对应的资源,当然那些和群组、Token的绑定关系也全部释放掉

Tio.close

  • 如果是用t-io做TCP服务器,此方法等价于Tio.remove();
  • 如果是用t-io做TCP客户端
    • 该方法会断开当前TCP连接
    • 如果业务程序配置了重连策略(就是:ReconnConf):
      • t-io后面会进行重连操作,也就是说并不会抛弃该条TCP连接对应的ChannelContext对象
      • 如果该条TCP连接对应的ChannelContext对象绑定了groupid、userid、token、bsId,那么这些绑定关系会全部释放掉,在重连成功后,业务侧需要再次进行绑定
    • 如果业务程序没有配置重连策略(就是:ReconnConf),此方法等价于Tio.remove()

简单看下重连代码

    /**
* 启动重连任务
*
* @author tanyaowu
*
*/
private void startReconnTask() {
final ReconnConf reconnConf = clientTioConfig.getReconnConf();
if (reconnConf == null || reconnConf.getInterval() <= 0) {
return;
}

// 进行重连操作,代码省略 ... ...
}

出现网络异常或其它异常时,业务需要主动调用这俩方法吗?

答:不需要的,出现任何网络异常,t-io都会释放掉该条TCP连接对应的全部资源,这也是t-io如此稳定的一大原因。网络编程的很多坑,都是源于资源没释放