WebSocket加入心跳包防止自動斷開連線

2021-09-29 03:37:49 字數 2152 閱讀 9561

近日,在公司中開發乙個使用websocket為前端推送訊息的功能時,發現乙個問題:就是每隔一段時間如果不傳送資料的話,與前段的連線就會自動斷開;

剛開始以為是session的原因,因為web session 的預設時間是30分鐘;但是通過日誌發現斷開時間間隔時間遠遠不到30分鐘;認真分析發現不操作間隔恰好為90秒

它就會在自動斷開;隨恍然大悟;原來是我們的使用nginx **,nginx配置了訪問超時時間為90s;

websocket是html5中用來實現長連線的乙個協議。

在同時使用nginx反向**和websocket的時候,因為websocket的通訊管道必須都要一直處於開啟狀態。

proxy_read_timeout 90;
解決方案:

1. 修改nginx配置

nginx 通過在客戶端和後端伺服器之間建立起一條隧道來支援websocket。

為了使nginx可以將來自客戶端的upgrade請求傳送給後端伺服器,upgrade和connection的頭資訊必須被顯式的設定。如下所示:

location /web/count
一旦我們完成以上設定,nginx就可以處理websocket連線了。

注意,必須要有

proxy_set_header host $host:$server_port;
這個配置

否則,會報:

websocket connection to 'ws:' failed: error during websocket handshake: unexpected response code: 403的錯誤

2. 也可以在前端頁面也新增心跳機制保持連線。

var userid=$("#userid").val();

var lockreconnect = false; //避免ws重複連線

var ws = null; // 判斷當前瀏覽器是否支援websocket

var wsurl = serverconfig.cyberhouse_ws+userid;

createwebsocket(wsurl); //連線ws

function createwebsocket(url) else if('mozwebsocket' in window)else);

}initeventhandle();

}catch(e)

}function initeventhandle() ;

ws.onerror = function () ;

ws.onopen = function () ;

ws.onmessage = function (event) else if(obj.type=="friend" || obj.type=="group")

};}// 監聽視窗關閉事件,當視窗關閉時,主動去關閉websocket連線,防止連線還沒斷開就關閉視窗,server端會拋異常。

window.onbeforeunload = function()

function reconnect(url) , 2000);

}//心跳檢測

var heartcheck = ,

start: function(), self.timeout)

}, this.timeout)

}}

// 收到客戶端訊息後呼叫的方法 

@onmessage

public void onmessage(string message, session session) else

}

系統發現websocket每隔10分鐘自動斷開連線,搜了很多部落格都說設定一下nginx的

keepalive_timeout

proxy_connect_timeout

proxy_send_timeout

proxy_read_timeout

這四個欄位的時長即可,然而好像並不奏效。遂採取心跳包的方式每隔9分鐘客戶端自動傳送ping訊息給服務端,服務端不需要返回。即可解決問題。

WebSocket加入心跳包防止自動斷開連線

近日,在公司中開發乙個使用websocket為前端推送訊息的功能時,發現乙個問題 就是每隔一段時間如果不傳送資料的話,與前段的連線就會自動斷開 剛開始以為是session的原因,因為web session 的預設時間是30分鐘 但是通過日誌發現斷開時間間隔時間遠遠不到30分鐘 認真分析發現不操作間隔...

給websocket加入心跳包防止自動斷開連線

原文 var userid userid val var lockreconnect false 避免ws重複連線 var ws null 判斷當前瀏覽器是否支援websocket var wsurl serverconfig.cyberhouse ws userid createwebsocket...

給websocket加入心跳包防止自動斷開連線

var userid userid val var lockreconnect false 避免ws重複連線 var ws null 判斷當前瀏覽器是否支援websocket var wsurl serverconfig.cyberhouse ws userid createwebsocket ws...