Unable to unwrap data, invalid status [CLOSED]-服務端webSocket報錯

一隻愛閱讀的程式設計師發表於2021-11-16

一、問題由來

現在的專案中在使用webSocket這門技術,主要用來在服務端和客戶端進行實時的資料傳輸,因為需要及時的進行響應,所以才沒有使用http請求的方式,

而是使用socket的方式,這樣可以快速建立起連線,並且能夠將小程式端的操作實時的在客戶端unity程式中進行響應。最開始做這個專案的時候,自己對

於技術選型這一塊,就考慮使用webSocket,經常會在各種部落格、論壇中看到關於它的介紹和使用。而且給人的感覺不是太難,因此就打算使用它。客戶端

程式主要是unity程式來進行處理,會和java寫的服務端進行實時通訊傳輸很多資料,在剛開始測試的階段我們都不知道這種方案能不能行得通,在經過多次

反覆地測試之後,發現這種方式可行,最終採用這門技術應用於現在的系統當中。可是後來在使用的過程中出現一個問題,就是當webSocket執行出現異常,

比如客戶端和服務端的連線由於網路不好斷開之後,當網路恢復正常再次進行連線時就會頻繁報錯,

 

 報錯資訊是客戶端傳送的心跳包資料,由於客戶端不知道服務端已經出現問題,因此頻繁的傳送心跳包就一直報錯。

二、問題分析

自己在寫服務端時,當執行onError方法時,會清除一個唯一的webSocket連線,由於這個專案的特殊性,只需要始終讓服務端和客戶端保持有一個有效的連線

即可。自己的想法是,明明已經清楚了服務端唯一的連線,為什麼還會出現這種問題呢?

 

 這個問題隔三差五的就會出現,必須要解決,如果不解決的話肯定會影響專案的正常執行。

三、解決方案

進過對問題的仔細分析後,自己嘗試著去解決這個問題,一個一個地進行嘗試。

方案一:在執行出錯的時候,主動呼叫webSocket中提供的關閉連線的方法,使用this來進行呼叫。

 

 測試結果,沒有解決。

方案二:在執行出錯的時候,主動獲取集合裡面的那個唯一的webSockerServer物件,然後使用這個物件來呼叫onClose方法,並且關閉當前的連線

會話session。

 

 程式碼修改好之後,和客戶端進行反覆的聯調測試,發現問題解決。解決這個問題的思路就是,如果服務端執行出現異常,就在服務端主動

關閉這個連線;當這個連線關閉之後,當客戶端和服務端想再次進行通訊時,就會重新建立一個新的連線,保重系統的正常執行。

至此問題解決,可能也是這個專案的特殊性才導致這個專案只需要有一個唯一的連線就可以,遇到的問題也比較好解決。總結一下就是如果

服務端想關閉掉某個連線,則最好是先找到這個webSocket這個連線,然後關閉即可,還有關閉當前的會話資訊,不能使用集合直接清除,

直接清除結合的話,webSocketServer是清除了,可是連線會話資訊卻還在,因此導致我出現那個問題。

相關文章