1. 心跳机制概念:
由于网络阻塞,服务器宕机,停电,等等不确定因素,会导致socket无效,那么就需要一种方式检测socket是否正常连接,通常使用客户端和服务器端间隔固定一段时间发送一次数据,对方收到并回应,就表明socket正常,这种方式叫心跳机制。
2. 心跳包的实现思路:
客户端连接上服务端后,在服务端会维护一个在线客户端列表。客户端每隔一段时间,向服务端发送一个心跳包,服务端受收到包以后,会更新客户端最近一次在线时间。一旦服务端超过规定时间没有接收到客户端发来的包,则视为掉线。
3. 客户端每隔一段时间,发送一个心跳包:
var timer = new System.Timers.Timer();
timer.Interval = 60000; //1m触发一次
timer.Start();
timer.Elapsed += (sender, args) =>
{
Console.WriteLine("开始发送心跳包");
MMessage message = new MMessage();
message.MessageType = MessagePicks.Heartbeat;
// message.From = loginName;
WriteToStream(message);
};
4.服务端每隔一段时间检测:
var timer = new Timer();
timer.Interval = 60000; //1m触发一次
timer.Start();
timer.Elapsed += (sender, args) =>
{
List<MClient> offClients = new List<MClient>();
foreach (var client in clients)
{
if ((DateTime.Now - client.LastOnLine).TotalMinutes > 1)
{
Console.WriteLine("用户" + client.Name + "掉线!");
offClients.Add(client);
}
}
foreach (var offClient in offClients)
{
clients.Remove(offClient);
}
};