我在客户端维护一个tcp连接池,用channel实现的,并每一个设置超时时间,如果当超时时间过了,我客户端调用close 关闭这个连接,服务端的这个连接还存在吗?还是说要等服务端的超时,系统自动回收?
服务端是否要发心跳?如果发心跳怎么处理?我客户端的连接都保存在channel当中,发心跳字段的话,好像没办法处理吧? 不发的话会停止长连接?
有点明白了。
1. 服务端没有封装net.Conn对象,客户端close的话,就算服务端不调用close,也会被gc处理掉,但是不知道这个gc会在多久回收服务端无用的net.Conn。
如果服务端封装net.Conn对象,将他储存了,那是不是应该由服务端定时发送请求,检测客户端对应conn是否关闭了,然后清理掉?
2.心跳包就是用来检测对面是不是还保留了连接,每一个连接都发送心跳。你的意思是不需要发送心跳,结合1,3说的,超时就关闭客户端,不需要管服务端掉不掉close,换一条连接就行的意思么?
#4
更多评论
可以先看看网络编程
tcp的握手,服务端的桥看看这个应该就明白了。
每个连接都是独立处理
你的桥都断了,怎么发心跳包过去。
你遍历另外的连接,通过这个桥告诉客户端,你有一个桥Id断了,让它重建。 或者你客户端设置一个断连重连过程。
#1
谢谢你的回答,我可能没说清楚。我再描述下问题。主要是不太清楚需不需要发送心跳包,以及哪边发送
1.golang的tcp编程里面,对于每一个conn,两边都有close方法,我是不是需要两边都调用close方法,才能正常挥手? 如果我只调用了client的close,服务端的这个conn是否正常关闭了,还是说长期保有占用资源?
2.心跳是在两边都不关闭的时候的发送,但是如果我服务端发送的话,客户端的conn都在channel里面,无法处理收到消息吧? 我应该定时遍历channel去处理心跳包吗?还是说不需要发心跳包?
3.还有一个方法,client 从channel获取conn的时候就发送心跳包检测,有反应才返回,无反应的话就重新建立个连接返回?这样好像代价比较大
求大佬看看。。。
#2