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

看到最近有不少人在blog上問關於WebSocket客戶端鏈接和掉線的問題,有一部分我之前也遇到過,在這裏我羅列了一些我之前遇到過的問題和其餘簡單的WebSocket服務。web

 

Q1 客戶端鏈接不上的問題後端

   這個問題我遇到的基本集中在後端,遇到的話須要收集日誌進行分析,首先要查看是由於什麼緣由出現問題的,不過這種狀況下多半會出現ExceptionException着手分析問題便可瀏覽器

 

Q2 1客戶端掉線問題服務器

   這裏所指的客戶端掉線的問題是指客戶端非正常掉線有的時候會出現Exception經過處理Exception便可關閉鏈接有的時候像客戶端忽然網絡離線的狀況下這個時候後臺沒有收到客戶端發來的close frame會認爲這個客戶端仍是處在在線的狀況那這個問題能夠經過心跳包的問題解決也能夠經過客戶端向服務器發心跳包也能夠服務器發送心跳包至客戶端咱們最終採用的方案是客戶端向服務端發送心跳包服務端收到心跳包後會檢測當前websocket session隊列中是否存在同屬性的websocket session有的話關閉之前的session便可我我的認爲仍是服務端像客戶端發送心跳包好一些但這樣作要注意性能問題。websocket

 

Q3 websocket鏈接後1分鐘自動斷開關閉網絡

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

window.setInterval(function(){ //每隔5秒鐘發送一次心跳,避免websocket鏈接因超時而自動斷開
var ping = {"type":"ping"};
ws.send(JSON.stringify(ping));
},5000);
socket

Q4 能收到客戶端消息後臺也顯示發送可是客戶端收不到 
   這個問題經我我的觀察和猜想應該是websocketsession沒有成功關閉或者成功關閉可是和一個websocketsession對應多個session有關由於我把上面的問題解決了以後這個問題也沒出現過了
性能

 

   最近由於工做需求較多,又有新項目要進來,項目週期太緊了,通過團隊商量,本身開發WebSocket這一塊,要作穩定成本過高了,因此咱們決定使用第三方的WebSocket服務,通過咱們對比多個第三方服務,最終發現了一個Java websocket神器叫GoEasy,相比較其餘的三方,我以爲這個上手更加簡單,對各類瀏覽器的兼容也很是好。用到如今也沒有什麼問題,大家有興趣的能夠去試一下。spa

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

   但願我遇到的問題以及解決方案對大家有所幫助。

相關文章
相關標籤/搜索