Socket之心跳包實現思路
阿新 • • 發佈:2017-12-13
har date 超過 off comm padding int msg tar
由於最近要做一個客戶端,但是要求有一個掉線檢測的功能,下面讓我們看看使用自定義的HeartBeat方式來檢測客戶端的連接情況。
心跳包的實現思路:
客戶端連接上服務端後,在服務端會維護一個在線客戶端列表。客戶端每隔一段時間,向服務端發送一個心跳包,服務端受收到包以後,會更新客戶端最近一次在線時間。一旦服務端超過規定時間沒有接收到客戶端發來的包,則視為掉線。
代碼:
客戶端每隔一段時間,發送一個心跳包:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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);
};
|
服務端每隔一段時間檢測:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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);
}
};
|
服務端收到心跳包的處理邏輯:
1 2 3 4 5 6 7 8 9 10 |
Console.WriteLine( "收到客戶端" + msg.RemoteEndPoint + "的心跳回應包." );
client.LastOnLine = DateTime.Now; //收到心跳包,更新時間
client.Name = msg.RemoteEndPoint.ToString();
client.RemoteEndPoint = msg.RemoteEndPoint;
if (!clients.Contains(client))
{
clients.Add(client);
}
|
效果:
Socket之心跳包實現思路