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