Unity3D網(wǎng)絡(luò)-心跳包

握手過程中傳送的包里不包含數(shù)據(jù)垂券,三次握手完畢后,客戶端與服務(wù)器才正式開始傳送數(shù)據(jù)。理想狀態(tài)下菇爪,TCP連接一旦建立算芯,在通信雙方中的任何一方主動(dòng)關(guān)閉連接之前,TCP 連接都將被一直保持下去凳宙。斷開連接時(shí)服務(wù)器和客戶端均可以主動(dòng)發(fā)起斷開TCP連接的請求熙揍,斷開過程需要經(jīng)過“四次握手”(過程就不細(xì)寫了,就是服務(wù)器和客戶端交互氏涩,最終確定斷開)

什么是心跳

剛才說到長連接建立連接后届囚,理想狀態(tài)下是不會斷開的,但是由于網(wǎng)絡(luò)問題是尖,可能導(dǎo)致一方斷開后意系,另一方仍然在發(fā)送數(shù)據(jù),或者有些客戶端長時(shí)間不發(fā)送消息饺汹,服務(wù)器還維持這他的客戶端不必要的引用蛔添,增加了服務(wù)器的負(fù)荷。因此我們引入了心跳機(jī)制兜辞。

心跳包之所以叫心跳包是因?yàn)椋核裥奶粯用扛艄潭〞r(shí)間發(fā)一次作郭,以此來告訴服務(wù)器,這個(gè)客戶端還活著弦疮。事實(shí)上這是為了保持長連接夹攒,至于這個(gè)包的內(nèi)容,是沒有什么特別規(guī)定的胁塞,不過一般都是很小的包咏尝,或者只包含包頭的一個(gè)空包。

總的來說啸罢,心跳包主要也就是用于長連接的北嗉欤活和斷線處理。一般的應(yīng)用下扰才,判定時(shí)間在30-40秒比較不錯(cuò)允懂。如果實(shí)在要求高,那就在6-9秒衩匣。

怎么發(fā)送心跳蕾总?

  • 1:輪詢機(jī)制
    輪詢:概括來說是服務(wù)端定時(shí)主動(dòng)的與客戶端通信,詢問當(dāng)前的某種狀態(tài)琅捏,客戶端返回狀態(tài)信息生百,客戶端沒有返回,則認(rèn)為客戶端已經(jīng)宕機(jī)柄延,然后服務(wù)端把這個(gè)客戶端的宕機(jī)狀態(tài)保存下來蚀浆,如果客戶端正常,那么保存正常狀態(tài)。如果客戶端宕機(jī)或者返回的是定義的失效狀態(tài)那么當(dāng)前的客戶端狀態(tài)是能夠及時(shí)的監(jiān)控到的市俊,如果客戶端宕機(jī)之后重啟了那么當(dāng)服務(wù)端定時(shí)來輪詢的時(shí)候杨凑,還是可以正常的獲取返回信息,把其狀態(tài)重新更新摆昧。

  • 2:心跳機(jī)制
    心跳:最終得到的結(jié)果是與輪詢一樣的但是實(shí)現(xiàn)的方式有差別撩满,心跳不是服務(wù)端主動(dòng)去發(fā)信息檢測客戶端狀態(tài),而是在服務(wù)端保存下來所有客戶端的狀態(tài)信息据忘,然后等待客戶端定時(shí)來訪問服務(wù)端,更新自己的當(dāng)前狀態(tài)搞糕,如果客戶端超過指定的時(shí)間沒有來更新狀態(tài)勇吊,則認(rèn)為客戶端已經(jīng)宕機(jī)。

心跳比起輪詢有兩個(gè)優(yōu)勢:
1.避免服務(wù)端的壓力
2.靈活好控制


代碼演示

服務(wù)器端

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

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

    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次心跳超時(shí)汉规,服務(wù)器比客戶端多判斷一次
            {
                Console.WriteLine(client.userdata.username+ "心跳超時(shí),斷開鏈接");
                RemoveClient(client);
            }
        }
    }
 //接收客戶端消息驹吮,并進(jìn)行分發(fā)
    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;
        }
    }

客戶端

//接收到服務(wù)器心跳
    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)//心跳超時(shí)
            {
                count++;
                lastHeartTime = Time.time;
                Debug.Log("心跳超時(shí)一次");
                if (count >= 3)//心跳超時(shí)3次
                {
                    count = 0;
                    Debug.Log("心跳超時(shí)3次,斷線處理");
                    //斷線處理
                    client.OnClose();
                }
            }
        }
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末碟狞,一起剝皮案震驚了整個(gè)濱河市啄枕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌族沃,老刑警劉巖频祝,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異脆淹,居然都是意外死亡常空,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門盖溺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來漓糙,“玉大人,你說我怎么就攤上這事烘嘱±デ荩” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵蝇庭,是天一觀的道長为狸。 經(jīng)常有香客問我,道長遗契,這世上最難降的妖魔是什么辐棒? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上漾根,老公的妹妹穿的比我還像新娘泰涂。我一直安慰自己,他們只是感情好辐怕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布逼蒙。 她就那樣靜靜地躺著,像睡著了一般寄疏。 火紅的嫁衣襯著肌膚如雪是牢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天陕截,我揣著相機(jī)與錄音驳棱,去河邊找鬼。 笑死农曲,一個(gè)胖子當(dāng)著我的面吹牛社搅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乳规,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼形葬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了暮的?” 一聲冷哼從身側(cè)響起笙以,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎冻辩,沒想到半個(gè)月后源织,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡微猖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年谈息,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凛剥。...
    茶點(diǎn)故事閱讀 40,015評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡侠仇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出犁珠,到底是詐尸還是另有隱情逻炊,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布犁享,位于F島的核電站余素,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏炊昆。R本人自食惡果不足惜桨吊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一威根、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧视乐,春花似錦洛搀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至伸刃,卻和暖如春谎砾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捧颅。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工景图, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人隘道。 一個(gè)月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓症歇,卻偏偏與公主長得像郎笆,于是被迫代替她去往敵國和親谭梗。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器狐树,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 10,975評論 6 13
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架劫窒,建立于...
    Hsinwong閱讀 22,409評論 1 92
  • 互聯(lián)網(wǎng)推送服務(wù)原理:長連接+心跳機(jī)制(MQTT協(xié)議)Android推送技術(shù)研究Android實(shí)現(xiàn)推送方式解決方案a...
    合肥黑閱讀 3,026評論 0 12
  • 3月21日早上七點(diǎn)從家出門,到現(xiàn)在3月22日整整兩天的時(shí)間燃乍,我卻像是挨過了一個(gè)星期那么久。 今天正好也是距離回國第...
    Liou噠噠閱讀 176評論 0 0