看到最近有不少人在blog上問關於WebSocket客戶端鏈接和掉線的問題,有一部分我之前也遇到過,在這裏我羅列了一些我之前遇到過的問題和其餘簡單的WebSocket服務。web
Q1 客戶端鏈接不上的問題後端
這個問題我遇到的基本集中在後端,遇到的話須要收集日誌進行分析,首先要查看是由於什麼緣由出現問題的,不過這種狀況下多半會出現Exception,從Exception着手分析問題便可。瀏覽器
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
但願我遇到的問題以及解決方案對大家有所幫助。