以前玩王者榮耀,遊戲在後臺。當我進入前臺時,我發現我可能會以加速的方式在後臺播放剛才遊戲的視頻,直到我到達最近的點(這只是我的猜測)。
1.如果網絡狀況異常(比如切換網絡或者當前網絡不穩定),客戶端會觸發斷開連接再連接(此時客戶端網絡已經斷開)。
2.由於網絡延遲和網絡鏈接異常,心跳包無法正常發送到服務器。
這裏可以有兩種判斷方法,壹種是針對服務器的,壹種是針對客戶端的。
3.客戶端裁剪遊戲,客戶端在後臺。壹定時間後,服務器會主動斷開與客戶端的連接,客戶端需要主動觸發重新連接。
主要分為四個階段。
1.連接時記錄網絡類型,切換到前臺,再次獲取網絡類型。如果類型不壹致,您需要重新連接。
2.記錄連接的IP地址,切換到前臺獲取IP。如果IP不同,則需要重新連接。
這裏會出現壹些問題,就是當我們切換網絡的時候,也會出現斷網重連的情況,因為wifi情況下的IP和4g情況下的IP是不壹樣的(這個我還不明白怎麽解決,王者榮耀裏也有這種情況)。
首先,在通信包的協議設計中,每個包頭都包含壹個名為pkgid的字段。
客戶端的每個上行請求包都有壹個下行響應包被服務器壹壹對應,它們的pkgid是壹樣的。
服務器的主動推送包pkgid=0。
客戶端的實現:
客戶端有壹個隊列,記錄發送的請求包,然後在收到服務器的響應後刪除相應的請求。
如果超時後沒有收到響應,可以認為有斷線,重新發送緩存的請求,將pkgid設置為負數來標記重傳包。
重試次數是有限制的。如果超過次數仍得不到回復,會提示斷開連接,退出登錄界面。
服務器的實現:
服務器打開緩存池,記錄壹定數量的最近響應包和通知推送包。
當收到壹個重傳包時,通過player id+pkgid從緩存池中索引最近緩存的響應包,如果緩存命中則直接發出記錄,否則重傳失敗,服務器做線程踢(線程踢完後,客戶端繼續進行登錄過程)。
當客戶端斷開連接時,用戶會進入主機狀態,直到用戶因為主機遊戲再次進入。