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