WebSocket斷線重連
WebSocket斷線重連 即時通訊 心跳重連
廢話不多說,直接上程式碼.
$scope.timeout = 10800,//3分鐘發一次心跳
$scope.timeoutObj = null,
$scope.serverTimeoutObj = null,
$scope.init = function() {
$scope.lockReconnect = false,
$scope.wsUrl = "wss://xxx:8888";
// 監聽視窗關閉事件,當視窗關閉時,主動去關閉websocket連線,防止連線還沒斷開就關閉視窗,server端會拋異常。
window.onbeforeunload = function() {
ws.close();
}
//建立WebSocket物件
$scope.createWebSocket = function() {
try {
if(window.WebSocket || window.MozWebSocket) {
ws = new WebSocket($scope.wsUrl);
}
$scope.initEventHandle();
} catch(e) {
$scope.reconnectWebSocket($scope.wsUrl);
}
},
$scope.initEventHandle = function() {
/*** 連線建立時觸發 */
ws.onopen = function(e) {
//傳送登入資訊
msg = new Object();
ws.send('xxx');
$scope.heartCheckWebSocket(); //心跳檢測重置
};
ws.onmessage = function(e) {
$scope.heartCheckWebSocket(); //如果獲取到訊息,心跳檢測重置
//拿到任何訊息都說明當前連線是正常的
$scope.handMsg(e.data);
};
ws.onclose = function(e) {
$scope.reconnectWebSocket($scope.wsUrl);
//console.log("伺服器拒絕了連線. 請檢查伺服器是否啟動");
};
ws.onerror = function(e) {
$scope.reconnectWebSocket($scope.wsUrl);
//console.log("連線已斷開,請重新整理頁面重新登入。");
};
},
//處理訊息
$scope.handMsg = function(eventData) {
if(!eventData) return;
if(eventData == "close") {
$scope.reconnectWebSocket($scope.wsUrl);
//這裡要注意onclose的第一個引數必須是1000或者3000—4999
//console.log("伺服器通知關閉");
} else {
//這裡收到後端返回一個心跳訊息,如果data返回空,則說明連線正常,到此停止處理
//這裡是你要寫的邏輯程式碼
}
},
//重連
$scope.reconnectWebSocket = function() {
if($scope.lockReconnect) return;
$scope.lockReconnect = true;
setTimeout(function() {
$scope.createWebSocket(wsUrl);
$scope.lockReconnect = false;
}, 2000);
},
//心跳檢測
$scope.heartCheckWebSocket = function() {
//重置
$timeout.cancel($scope.timeoutObj);
$timeout.cancel($scope.serverTimeoutObj);
//開啟
$scope.timeoutObj = $timeout(function() {
//這裡傳送一個心跳,後端收到後,返回一個心跳訊息,
//onmessage拿到返回的心跳就說明連線正常
//傳送登入資訊
msg = new Object();
ws.send('xxx');
$scope.serverTimeoutObj = $timeout(function() {
//如果超過一定時間還沒重置,說明後端主動斷開了
//如果onclose會執行reconnect,我們執行ws.close()就行了.如果直接執行reconnect 會觸發onclose導致重連兩次
ws.close();
}, $scope.timeout);
}, $scope.timeout);
}
}
相關文章
- ai問答:vue3+pinia+WebSocket 封裝斷線重連(實戰)AIVueWeb封裝
- websocket連線Web
- 【問題記錄】—SignalR連線斷線重連SignalR
- 記一次websocket的自動斷開連線Web
- ADO 資料庫連線斷開重連資料庫
- uni-app中websocket的使用 斷開重連、心跳機制APPWeb
- Websocket 突破最大長連線Web
- 細說websocket快速重連機制Web
- WebSocket連線的負載均衡Web負載
- 微信小程式實現WebSocket心跳重連微信小程式Web
- 理解WebSocket心跳及重連機制(五)Web
- 好用的websocket 心跳重連js指令碼WebJS指令碼
- [譯] Go 實現百萬 WebSocket 連線GoWeb
- Django使用channels實現Websocket連線DjangoWeb
- websocket連線mina被拒絕Web
- 體驗用yarp連線websocketWeb
- java連線池解決連線中斷Java
- Thinkphp mysql 資料庫斷線重連 MySQL server has gone awayPHPMySql資料庫ServerGo
- 淺析 Netty 實現心跳機制與斷線重連Netty
- java netty 實現 websocket 服務端和客戶端雙向通訊 實現心跳和斷線重連 完整示例JavaNettyWeb服務端客戶端
- golang websocket android連線的問題GolangWebAndroid
- websocket 建立連線時如何進行授權?Web
- java操作Oracle 方式一 ( 連線-》操作-》斷開連線 )JavaOracle
- 判斷網路是否連線
- [Swoole] 從原始碼中查 Websocket 連線問題原始碼Web
- 【Swoole】從原始碼中查 Websocket 連線問題原始碼Web
- Android websocket長連線+點對點訂閱AndroidWeb
- 使用 WebSocket 客戶端連線 MQTT 伺服器Web客戶端MQQT伺服器
- 校園路由器斷網重連路由器
- SQL Server如何判斷哪些會話/連線是長連線?SQLServer會話
- 長連線的心跳及重連設計
- 保持ssh的連線不斷開
- 1204 斷開式連線
- GOLANG探測HTTP連線斷開GolangHTTP
- 使用websocket連線(對接)asp.net core signalrWebASP.NETSignalR
- 基於 Apaache 的 laravel-websocket SSL配置(wss連線)LaravelWeb
- WebSocket:從建立連線到關閉的完整流程Web
- WebSocket系列之如何建立和維護可靠的連線Web