1. 程式人生 > >Socket之心跳包實現思路

Socket之心跳包實現思路

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之心跳包實現思路