关于golang socket 编程的 连接池和长连接问题

cyxr001 · · 1317 次点击
你做连接池的目的不就是保证能和服务端的正常通信么,只要当前有一条可用就行吧。 只要连接断了,就把相应的封装对象从你的管理连接表里面移除就行,等着客户端新建连接,没必要再通知客户端,客户端有自己的检测机制,它是能识别到这个连接断的。由它自己处理相应的逻辑。 一般服务端肯定是要有一个管理连接的对象存在的。 心跳包一般来说就是看客户端能不能达到服务端,在服务端崩溃的情况下就收不到了,所以用来确认两端的状态。还有做连接池的目的可能是当前连接忙,需要选择另外一条连接。
#5
更多评论
可以先看看网络编程 tcp的握手,服务端的桥看看这个应该就明白了。 每个连接都是独立处理 你的桥都断了,怎么发心跳包过去。 你遍历另外的连接,通过这个桥告诉客户端,你有一个桥Id断了,让它重建。 或者你客户端设置一个断连重连过程。
#1
谢谢你的回答,我可能没说清楚。我再描述下问题。主要是不太清楚需不需要发送心跳包,以及哪边发送 1.golang的tcp编程里面,对于每一个conn,两边都有close方法,我是不是需要两边都调用close方法,才能正常挥手? 如果我只调用了client的close,服务端的这个conn是否正常关闭了,还是说长期保有占用资源? 2.心跳是在两边都不关闭的时候的发送,但是如果我服务端发送的话,客户端的conn都在channel里面,无法处理收到消息吧? 我应该定时遍历channel去处理心跳包吗?还是说不需要发心跳包? 3.还有一个方法,client 从channel获取conn的时候就发送心跳包检测,有反应才返回,无反应的话就重新建立个连接返回?这样好像代价比较大 求大佬看看。。。
#2