看到最近有很多人在blog上問關于WebSocket客戶端連接和掉線的問題,有一部分我以前也遇到過,在這里我羅列了一些我以前遇到過的問題和其他簡單的WebSocket服務。
Q1 客戶端連接不上的問題
這個問題我遇到的基本集中在后端,遇到的話需要收集日志進行分析,首先要查看是因為什么原因出現(xiàn)問題的,不過這種情況下多半會出現(xiàn)Exception,從Exception著手分析問題即可。
Q2 1客戶端掉線問題
這里所指的客戶端掉線的問題是指客戶端非正常掉線。有的時候會出現(xiàn)Exception,通過處理Exception即可關閉連接,有的時候像客戶端突然網(wǎng)絡離線的情況下,這個時候后臺沒有收到客戶端發(fā)來的close frame,會認為這個客戶端還是處在在線的情況。那這個問題可以通過心跳包的問題解決。也可以通過客戶端向服務器發(fā)心跳包,也可以服務器發(fā)送心跳包至客戶端。我們最終采用的方案是客戶端向服務端發(fā)送心跳包,服務端收到心跳包后會檢測當前websocket session隊列中是否存在同屬性的websocket session,有的話關閉以前的session即可。我個人認為還是服務端像客戶端發(fā)送心跳包好一些,但這樣做要注意性能問題。
Q3 websocket連接后1分鐘自動斷開關閉
這是因為websocket長連接有默認的超時時間(1分鐘,由proxy_read_timeout決定),就是超過一定的時間沒有發(fā)送任何消息,連接會自動斷開。解決辦法就是讓瀏覽器每隔一定時間(要小于超時時間)發(fā)送一個心跳。
代碼如下:
window.setInterval(function(){ //每隔5秒鐘發(fā)送一次心跳,避免websocket連接因超時而自動斷開
var ping = {"type":"ping"};
ws.send(JSON.stringify(ping));
},5000);
Q4 能收到客戶端消息,后臺也顯示發(fā)送,但是客戶端收不到
這個問題經(jīng)我個人觀察和猜測,應該是websocketsession沒有成功關閉或者成功關閉但是和一個websocketsession對應多個session有關,因為我把上面的問題解決了之后,這個問題也沒出現(xiàn)過了。
希望我遇到的問題以及解決方案對你們有所幫助。