最近在做Socket网络开发,首先必须解决得问题就是服务器与客户端之间通信的稳定性,最基本的可以用心跳来实现。我采用的是双向心跳机制,大致流程如下:
1.每隔一段时间,客户端主动给服务端发送一次心跳包。
2.服务端接收到客户端的心跳包后,立即回一个心跳包给客户端。
3.当服务器三次没有收到客户端的心跳包,则认为客户端已经断开连接。
4.当客户端发送三次心跳包给服务器后,都没有收到回复,则认为客户端已经与服务器失去连接。
嗨,和标题要说的问题扯远了。
在服务器定时检测客户端连接情况时,我采用的是System.Threading.Timer定时器来处理。但是后来测试的时候,发现这个执行一段时间后,就不再执行。觉得非常奇怪,后来经过分析和思考,发现用System.Threading.Timer启动定时器,只需要类似于下面的那样使用:
var timer = new System.Threading.Timer(CheckOnlineClient, null, 1000, 6000);
CheckOnlineClient就是检测客户端是否在线的方法
上面的定义是指延迟1秒开始计时,每隔6秒执行一次CheckOnlineClient方法。
但是我忘记了一个很重要的东西,那就是.NET CLR的自动回收机制,对于timer只有定义,没有引用,在CLR看来是应该被回收掉的。所以在一段时间后,timer就被回收掉了,就不可能还是继续执行CheckOnlineClient方法了。