Unity3D網絡-心跳包

握手過程中傳送的包里不包含數據,三次握手完畢后,客戶端與服務器才正式開始傳送數據。理想狀態下,TCP連接一旦建立,在通信雙方中的任何一方主動關閉連接之前,TCP 連接都將被一直保持下去。斷開連接時服務器和客戶端均可以主動發起斷開TCP連接的請求,斷開過程需要經過“四次握手”(過程就不細寫了,就是服務器和客戶端交互,最終確定斷開)

什么是心跳

剛才說到長連接建立連接后,理想狀態下是不會斷開的,但是由于網絡問題,可能導致一方斷開后,另一方仍然在發送數據,或者有些客戶端長時間不發送消息,服務器還維持這他的客戶端不必要的引用,增加了服務器的負荷。因此我們引入了心跳機制。

心跳包之所以叫心跳包是因為:它像心跳一樣每隔固定時間發一次,以此來告訴服務器,這個客戶端還活著。事實上這是為了保持長連接,至于這個包的內容,是沒有什么特別規定的,不過一般都是很小的包,或者只包含包頭的一個空包。

總的來說,心跳包主要也就是用于長連接的保活和斷線處理。一般的應用下,判定時間在30-40秒比較不錯。如果實在要求高,那就在6-9秒。

怎么發送心跳?

  • 1:輪詢機制
    輪詢:概括來說是服務端定時主動的與客戶端通信,詢問當前的某種狀態,客戶端返回狀態信息,客戶端沒有返回,則認為客戶端已經宕機,然后服務端把這個客戶端的宕機狀態保存下來,如果客戶端正常,那么保存正常狀態。如果客戶端宕機或者返回的是定義的失效狀態那么當前的客戶端狀態是能夠及時的監控到的,如果客戶端宕機之后重啟了那么當服務端定時來輪詢的時候,還是可以正常的獲取返回信息,把其狀態重新更新。

  • 2:心跳機制
    心跳:最終得到的結果是與輪詢一樣的但是實現的方式有差別,心跳不是服務端主動去發信息檢測客戶端狀態,而是在服務端保存下來所有客戶端的狀態信息,然后等待客戶端定時來訪問服務端,更新自己的當前狀態,如果客戶端超過指定的時間沒有來更新狀態,則認為客戶端已經宕機。

心跳比起輪詢有兩個優勢:
1.避免服務端的壓力
2.靈活好控制


代碼演示

服務器端

 private ServerManager()
    {
        IPAddress address = IPAddress.Parse(IP);
        listener = new TcpListener(address, Port);
        //綁定ip和port,進行偵聽
        listener.Start();
        Console.WriteLine("開始偵聽");

        //異步監聽客戶端連接
        listener.BeginAcceptTcpClient(OnAccecpt,null);
  
        //開啟定時器System.Threading.Timer
        Timer timer = new Timer(Callback,null, HeartInterval, HeartInterval);
        
        //定時器System.Timers
        //System.Timers.Timer t = new System.Timers.Timer();
        //t.Interval = 1000;//定時器間隔
        //t.Elapsed += delegate (object sender, System.Timers.ElapsedEventArgs e){ };
        //t.Enabled = true;//開啟定時器
    }

    void Callback(object state)
    {
        List<string> keys = new List<string>();
        foreach (var item in dic.Keys)
        {
            keys.Add(item);
        }
        for (int i = 0; i < keys.Count; i++)
        {
            SocketClient client = dic[keys[i]];
            client.SendMessage(Protocol.HeartBeat);
            client.timeOut++;
            if(client.timeOut>5)//4次心跳超時,服務器比客戶端多判斷一次
            {
                Console.WriteLine(client.userdata.username+ "心跳超時,斷開鏈接");
                RemoveClient(client);
            }
        }
    }
 //接收客戶端消息,并進行分發
    public void OnMessage(SocketClient client,int protocol,string msg)
    {
        switch (protocol)
        {
            case Protocol.Login_CMD:
                break;
            case Protocol.HeartBeat:
                //接收到心跳,重置timeOut
                client.timeOut = 0;
                break;
            default:
                break;
        }
    }

客戶端

//接收到服務器心跳
    void OnHeatBeat()
    {
        lastHeartTime = Time.time;
        count = 0;
        //返回心跳
        SendMessage(Protocol.HeartBeat);
    }

    float lastHeartTime = 0;
    int count = 0;
    void CheckHeat()
    {
        if(client.online && client.isloggin)
        {
            if (Time.time - lastHeartTime > 5)//心跳超時
            {
                count++;
                lastHeartTime = Time.time;
                Debug.Log("心跳超時一次");
                if (count >= 3)//心跳超時3次
                {
                    count = 0;
                    Debug.Log("心跳超時3次,斷線處理");
                    //斷線處理
                    client.OnClose();
                }
            }
        }
    }
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,637評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,555評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,629評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,976評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,139評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,686評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,411評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,641評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,820評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,362評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,604評論 2 380

推薦閱讀更多精彩內容