WebSocket客戶端連接不上和掉線的問題以及解決方案

WebSocket客戶端連接不上和掉線的問題以及解決方案

看到最近有很多人在blog上問關於WebSocket客戶端連接和掉線的問題,有一部分我以前也遇到過,在這裡我羅列了一些我以前遇到過的問題和其他簡單的WebSocket服務。

Q1 客戶端連接不上的問題

這個問題我遇到的基本集中在後端,遇到的話需要收集日誌進行分析,首先要查看是因為什麼原因出現問題的,不過這種情況下多半會出現Exception,從Exception著手分析問題即可。

Q2 1客戶端掉線問題

這裡所指的客戶端掉線的問題是指客戶端非正常掉線。有的時候會出現Exception,通過處理Exception即可關閉連接,有的時候像客戶端突然網路離線的情況下,這個時候後台沒有收到客戶端發來的close frame,會認為這個客戶端還是處在在線的情況。那這個問題可以通過心跳包的問題解決。也可以通過客戶端向伺服器發心跳包,也可以伺服器發送心跳包至客戶端。我們最終採用的方案是客戶端向服務端發送心跳包,服務端收到心跳包後會檢測當前websocket session隊列中是否存在同屬性的websocket session,有的話關閉以前的session即可。我個人認為還是服務端像客戶端發送心跳包好一些,但這樣做要注意性能問題。

Q3 websocket連接後1分鐘自動斷開關閉

這是因為websocket長連接有默認的超時時間(1分鐘,由proxy_read_timeout決定),就是超過一定的時間沒有發送任何消息,連接會自動斷開。解決辦法就是讓瀏覽器每隔一定時間(要小於超時時間)發送一個心跳。代碼如下:

window.setInterval(function(){ //每隔5秒鐘發送一次心跳,避免websocket連接因超時而自動斷開

var ping =

{"type":"ping"};

ws.send(JSON.stringify(ping));

},5000);

Q4 能收到客戶端消息,後台也顯示發送,但是客戶端收不到

這個問題經我個人觀察和猜測,應該是websocketsession沒有成功關閉或者成功關閉但是和一個websocketsession對應多個session有關,因為我把上面的問題解決了之後,這個問題也沒出現過了。

最近因為工作需求較多,又有新項目要進來,項目周期太緊了,經過團隊商量,自己開發WebSocket這一塊,要做穩定成本太高了,所以我們決定使用第三方的WebSocket服務,經過我們對比多個第三方服務,最終發現了一個Java websocket神器叫GoEasy,相比較其他的三方,我覺得這個上手更加簡單,對各種瀏覽器的兼容也非常好。用到現在也沒有什麼問題,你們有興趣的可以去試一下。

網址:http://www.goeasy.io

希望我遇到的問題以及解決方案對你們有所幫助。

推薦閱讀:

Spring boot+web Socket即時通訊
全雙工通信的 WebSocket
C# 完成WebSocket demo

TAG:客戶端 | WebSocket | 科技 |