在B/S結構的項目開發的過程當中
在服務端與客戶端正常的通信之外
服務端通常還需要知道客戶端是否還處於連接狀態
或者客戶端也需要知道服務端是否還處在開啟狀態
大白話說完了,聽一下比較正統的解釋吧(摘自網絡):
1:輪詢機制
輪詢:概括來說是服務端定時主動的去與要監控狀態的客戶端(或者叫其他系統)通信,詢問當前的某種狀態,客戶端返回狀態信息,客戶端沒有返回或返回錯誤、失效信息、則認為客戶端已經宕機,然后服務端自己內部把這個客戶端的狀態保存下來(宕機或者其他),如果客戶端正常,那么返回正常狀態,如果客戶端宕機或者返回的是定義的失效狀態那么當前的客戶端狀態是能夠及時的監控到的,如果客戶端宕機之后重啟了那么當服務端定時來輪詢的時候,還是可以正常的獲取返回信息,把其狀態重新更新。
2:心跳機制
心跳:最終得到的結果是與輪詢一樣的但是實現的方式有差別,心跳不是服務端主動去發信息檢測客戶端狀態,而是在服務端保存下來所有客戶端的狀態信息,然后等待客戶端定時來訪問服務端,更新自己的當前狀態,如果客戶端超過指定的時間沒有來更新狀態,則認為客戶端已經宕機或者其狀態異常。
心跳比起輪詢有兩個優勢:
1.避免服務端的壓力
2.靈活好控制
原理
1.與服務端約定好接口內容post請求和get請求都可以(安全起見還是post比較好)。如果服務端正常,則返回true。如果返回異常信息,或者回應超時,則判定服務端不正常。
2.設計好心跳時間。可以寫一個協程,在Start中便運行,在協程中控制心跳時間。使用while循環,保證客戶端只要開啟就一直循環下去。
IEnumerator Start() { while (true) { string url = "http://" + AppData.ServerIP + "/UnityAPI/GetSystemState"; WWWForm form = new WWWForm(); byte[] a = new byte[] { 1 }; WWW www = new WWW(url, a); yield return www; if (null != www.error) { bClosed = true; } else { if (!bool.Parse(www.text)) { bClosed = true; } else { bClosed = false; } } if (bClosed) { LoseServer(); } yield return new WaitForSeconds(5f); } }