学习使用js链接websocket服务断线重连的方法

本文介绍了如何在JavaScript中实现WebSocket的断线重连功能和心跳检测。通过创建WebSocket实例,监听onclose事件并在该事件触发时执行重连函数,配合定时器进行心跳检测,确保与服务器保持稳定连接。示例代码详细展示了整个流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习使用js链接websocket服务断线重连的方法

前言

我们在是有websocekt的时候,有的时候由于某些原先websocket会断开连接,我们需要重现连接,该如何实现呢?这就需要我们仔细研究websocket的api的使用了。

思路

首先我们要熟悉如下几个api

1、连接websocket的服务器的websocekt函数

2、websocekt断开后触发的onclose函数

由上面这两个函数就可以了,大致思路梳理一下:
1、首先开发一个函数websocketinit,函数主要是websocket的连接逻辑,监听信息,发送信息
2、监听onclose事件,onclose触发后重新执行websocketinit事件

示例代码

//1.创建websocket客户端
var host = window.location.host; #IP
var ut = "{{ ut }}";
var wsServer = 'wss://' + host + '/notify/wxlogin?ut=' + ut;

var timeConnect = 0;
webSocketInit(wsServer);

//socket初始化
function webSocketInit(service) {
    var ws = new WebSocket(service);
    ws.onopen = function () {
        console.log("已连接TCP服务器");
        ws.send('Hello WebSockets!');
    };
		//接收服务端的消息,根据自己的业务需求,开发对应的功能
    ws.onmessage = function (evt) {
        console.log('Received Message: ' + evt.data);

        data = JSON.parse(evt.data);
        console.log(data);
        if (data.status != 0) {
            alert("扫码错误");
            ws.close();
        }
        //判断身份,登录成功 并跳转到指定的页面
        if (data.data.wx_login == 1) {
            //window.location.href = "http://" + host + "/admin"
            window.location.href = "/admin"
        }
        if (data.data.wx_login == 0) {
            //alert(data.data.message)
            $(".qr_code").css("display", "none");
            $(".tips").text(data.data.message)

        }
        console.log(data.data);
    };

    ws.onclose = function () {
        console.log('服务器已经断开');
        reconnect(service);
    };
}

// 重连
function reconnect(service) {
    // lockReconnect加锁,防止onclose、onerror两次重连
    timeConnect++;
    console.log("第" + timeConnect + "次重连");
    // 进行重连
    setTimeout(function () {
        webSocketInit(service);
    }, 1000);

}

// 心跳 * 回应
setInterval(function () {
    var websocket = new WebSocket(wsServer);
    websocket.send('');

}, 1000 * 100)
### WebSocket 断线连及心跳检测实现 #### 一、WebSocket 心跳检测的作用 为了保持客户端与服务器之间的连接活跃状态并及时发现异常断开的情况,心跳检测机制显得尤为要。通过定期向服务器发送特定的消息(即心跳包),可以验证双方的网络连接是否正常工作。 #### 二、心跳检测的具体处理方案 ##### 1. 创建 WebSocket 连接 建立 WebSocket 链接时需指定目标 URL 地址以及可选协议列表: ```javascript const wsUrl = 'wss://example.com/socket'; let websocket; function createConnection() { try { websocket = new WebSocket(wsUrl); setupEventHandlers(); } catch (error) { console.error('Failed to connect:', error.message); } } ``` ##### 2. 设置心跳参数 定义心跳间隔时间和超时时间作为全局变量以便后续调用: ```javascript // 定义心跳周期为每30秒一次, 超时时长设为5秒 const HEARTBEAT_INTERVAL = 30 * 1000; const TIMEOUT_DURATION = 5 * 1000; ``` ##### 3. 构建心跳检测逻辑 编写函数用于启动定时器来执行心跳操作,并监听来自服务端的心跳回应: ```javascript let heartbeatTimer; let timeoutHandler; function startHeartbeat() { clearTimeout(timeoutHandler); function sendPing() { if (websocket.readyState === WebSocket.OPEN) { websocket.send(JSON.stringify({ type: "ping" })); timeoutHandler = setTimeout(handleTimeout, TIMEOUT_DURATION); } heartbeatTimer = setTimeout(sendPing, HEARTBEAT_INTERVAL); } // 发送首次心跳请求 sendPing(); // 处理超时情况下的新连接尝试 function handleTimeout() { console.warn("Heartbeat timed out."); reconnect(); } } // 接收pong消息后清除计时器 websocket.onmessage = event => { const message = JSON.parse(event.data); if (message.type === "pong") { clearTimeout(timeoutHandler); startHeartbeat(); } }; ``` ##### 4. 响应心跳包 当收到 `pong` 类型的消息表示对方已成功接收到了之前发出的 `ping` 请求,则启下一轮心跳循环;反之则触发超时事件进而采取相应措施如自动试等。 ##### 5. 断线连机制 一旦发生意外关闭或无法继续维持会话的情形之下,应当立即着手准备恢复通信链路的工作流程如下所示: ```javascript function reconnect() { clearInterval(heartbeatTimer); websocket.close(); // 尝试延迟一段时间后再创建新的链接实例 setTimeout(createConnection, 5000); } ``` 每当遇到错误或者非预期的状态变更都会被捕捉到从而激活上述提到过的 `reconnect()` 方法来进行自我修复动作直到恢复正常为止[^1]。 对于 Vue 应用程序而言,在组件挂载阶段初始化 Websocket 并注册必要的回调处理器即可完成整个过程中的交互控制部分[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值