最近项目的tcp网络通讯遇到了个奇怪的问题:心跳超时时间设置为2分钟,游戏场景加载使用的是同步加载,只要加载游戏场景,tcp连接就必掉线。
看了下场景加载耗时,绝对没有2分钟,但是5s还是有的。
把第一次捕获到掉线的地方的报错打印出来发现是:InvalidOperationException。发现socket 的isConnect 是false。
打印了下主动断开连接的地方发现没有打印,那应该是系统帮忙我们掉线的。
什么情况下socket会自动断开连接? 1、服务端把我们的连接断开了 2、我们的连接超时了
这里把receiveTimeout 注释掉发现没有问题了。这里的超时时间是15s, 心跳是每10s发送一次
超时时间 - 心跳时间 = 发送心跳的进程允许卡顿的时间。
发现允许卡顿的时间只有5s , 那5s以上的同步加载就会造成掉线。
那就发现解决办法了:1、把心跳和网络单独提出一个线程来管理 2、延长超时时间
如果时间和技术允许的情况下还是推荐第一种。
由于对多线程和网络通信不是太自信,还是选择了把超时时间延长为40s.