js websocket断线重连

js websocket断开重连实例代码,请根据自己需求做出相应改动Vue中使用websocket

$(function() {
	var lockReconnect = false;//避免重复连接
	var ws = null; //WebSocket的引用
	var wsUrl = "xxxxxx"; //这个要与后端提供的相同
	//创建WebSocket连接,如果不确定浏览器是否支持,可以使用socket.js做连接
	function createWebSocket(url){
		 try {
			 if ('WebSocket' in window) {
		        ws = new WebSocket("ws://" + url + "/socketServer");
		     } else {
		        ws = new SockJS("http://" + url + "/sockjs/socketServer");
		     }
	         initEventHandle();
	     } catch (e) {
	         reconnect(wsUrl);
	     }
	}
	
	function reconnect(url) {
        if(lockReconnect) return;
        lockReconnect = true;
        //没连接上会一直重连,设置延迟避免请求过多
        setTimeout(function () {
            createWebSocket(wsUrl);
            console.log("正在重连,当前时间"+new Date())
            lockReconnect = false;
        }, 5000); //这里设置重连间隔(ms)
    }
	
	 /*********************初始化开始**********************/
	function initEventHandle() {
		// 连接成功建立后响应
		ws.onopen = function() {
			console.log("成功连接到" + wsUrl);
			//心跳检测重置
			heartCheck.reset().start();
		}
		// 收到服务器消息后响应
		ws.onmessage = function(e) {
			//如果获取到消息,心跳检测重置
            //拿到任何消息都说明当前连接是正常的
            heartCheck.reset().start();
            //Json转换成Object
            var msg = eval('(' + e.data + ')');
            
            if(msg.message == "heartBeat"){
            	//忽略心跳的信息,因为只要有消息进来,断线重连就会重置不会触发
            }else{
            	//处理消息的业务逻辑
            }
        }

		// 连接关闭后响应
		ws.onclose = function() {
			console.log("关闭连接");
			reconnect(wsUrl);//重连
		}
		ws.onerror = function () {
			reconnect(wsUrl);//重连
		};
	} 
	/***************初始化结束***********************/
	 //心跳检测
    var heartCheck = {
        timeout: 15000,//毫秒
        timeoutObj: null,
        serverTimeoutObj: null,
        reset: function(){
            clearTimeout(this.timeoutObj);
            clearTimeout(this.serverTimeoutObj);
            return this;
        },
        start: function(){
            var self = this;
            this.timeoutObj = setTimeout(function(){
                //这里发送一个心跳,后端收到后,返回一个心跳消息,
                //onmessage拿到返回的心跳就说明连接正常
                ws.send("HeartBeat");
                console.log("HeartBeat");
                self.serverTimeoutObj = setTimeout(function(){//如果超过一定时间还没重置,说明后端主动断开了
                    ws.close();//如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
                }, self.timeout)
            }, this.timeout)
        }
    }

// 发送字符串消息

	$("#sendBtn").click(function() {
		if (ws.readyState ==1) {
			//自定义消息串,让后端接收
			ws.send("xxxxxx");
		}else{
			alert("当前连接超时,请刷新重试!");
		}
		return false;
	});

	// 强制退出
	window.onunload = function() {
		ws.close();
	}
	createWebSocket(wsUrl);/**启动连接**/
});

https://www.cnblogs.com/hellxz/p/9166138.htmlhttps://www.cnblogs.com/1wen/p/5808276.html

WebSocket 断线重连的实现可以分为两个部分:检测断线和重新连接。 1. 检测断线WebSocket 断开连接时,会触发 WebSocket 的 onclose 事件,我们可以在 onclose 事件中添加检测断线的逻辑。一般来说,在 onclose 事件中会设置一个定时器,定时检测 WebSocket 连接状态,如果发现 WebSocket 连接断开,则触发重新连接的逻辑。 2. 重新连接 在重新连接前,需要先清理之前的 WebSocket 连接,以避免产生冲突。然后可以使用 JavaScript 的 setTimeout 方法来进行延时重连,避免频繁连接服务器。 在重新连接时,需要注意以下几个点: - 每次重新连接需要重新创建一个 WebSocket 实例。 - 需要重新发送之前未成功发送的消息。 - 需要重新订阅之前的频道或房间。 下面是一个简单的示例代码: ``` let websocket = null; let timer = null; let isConnected = false; function connect() { websocket = new WebSocket('ws://localhost:8080'); websocket.onopen = () => { console.log('WebSocket 连接成功'); isConnected = true; clearTimeout(timer); }; websocket.onclose = () => { console.log('WebSocket 连接断开'); isConnected = false; timer = setTimeout(() => { connect(); }, 3000); }; websocket.onerror = () => { console.log('WebSocket 连接错误'); isConnected = false; timer = setTimeout(() => { connect(); }, 3000); }; websocket.onmessage = (event) => { console.log('收到消息:', event.data); }; } function sendMessage(message) { if (isConnected) { websocket.send(message); } else { console.log('WebSocket 未连接成功,消息发送失败'); } } connect(); ``` 在上面的示例代码中,我们创建了一个 WebSocket 实例,并在 onopen、onclose 和 onerror 事件中分别处理连接成功、连接断开和连接错误的情况。在连接断开时,我们使用 setTimeout 方法进行延时重连,并在重新连接成功后清除定时器。在 sendMessage 方法中,我们先检查 WebSocket 是否已连接成功,如果已连接成功,则发送消息,否则提示消息发送失败。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值