uni-app 封装websocket 心跳检测,开箱即用

javascript 复制代码
class websocketUtils {
	constructor(url, needbeat, options = {}) {
		this.needbeat = needbeat;
		this.url = url;
		this.options = options;
		this.ws = null;
		this.heartbeatInterval = options.heartbeatInterval || 10000; // 心跳间隔,默认为10秒  
		this.reconnectInterval = options.reconnectInterval || 5000; // 重连间隔,默认为5秒  
		this.reconnectAttempts = options.reconnectAttempts || Infinity; // 最大重连次数,默认为无限次  
		this.reconnectCount = 0;

		this.initWebSocket();
	}

	initWebSocket() {
		this.ws = uni.connectSocket({
			url: this.url,
			success: () => {
				console.log('WebSocket连接成功');
				if (this.needbeat) {
					this.startHeartbeat();
				}
				this.onOpen();
			},
			fail: (err) => {
				console.error('WebSocket连接失败', err);
				this.reconnect();
			}
		});


		// 监听WebSocket接收到服务器的消息事件  
		this.ws.onMessage((result) => {
			// const textDecoder = new TextDecoder();
			// let text = textDecoder.decode(result.data)
			// console.log('自定义处理消息:',result);
			this.onMessage(result);
			// 收到消息后,可能需要重置心跳计时器  
			// 是否需要心跳选择器
			if (this.needbeat) {
				this.resetHeartbeat();
			}
		})
		// 监听WebSocket关闭事件  
		this.ws.onClose(res => {
			console.log('WebSocket连接已关闭', res);
			this.onClose();
			this.reconnect();
		});

		// 监听WebSocket错误事件  
		this.ws.onError(err => {
			console.error('WebSocket发生错误', err);
			this.onError(err);
			this.reconnect();
		});
	}

	// 发送消息  
	send(data) {
		if (this.ws) {
			this.ws.send({
				data: data,
				success: () => {
					console.log('消息发送成功');
				},
				fail: (err) => {
					console.error('消息发送失败', err);
				}
			})
		}
	}

	// 心跳检测  
	startHeartbeat() {
		this.heartbeatTimer = setInterval(() => {
			this.sendHeartbeat();
		}, this.heartbeatInterval);
	}

	// 重置心跳计时器  
	resetHeartbeat() {
		clearInterval(this.heartbeatTimer);
		this.startHeartbeat();
	}

	// 发送心跳消息  
	sendHeartbeat() {
		this.send('ping'); // 假设心跳消息为'ping'  
	}

	// 重连逻辑  
	reconnect() {
		if (this.reconnectCount < this.reconnectAttempts) {
			setTimeout(() => {
				this.initWebSocket();
				this.reconnectCount++;
			}, this.reconnectInterval);
		}
	}

	// 自定义事件处理  
	onOpen() {}
	onMessage(data) {}
	onClose() {}
	onError(err) {}

	// 关闭WebSocket连接  
	close() {
		if (this.ws) {
			this.ws.close({
				success: () => {
					console.log('WebSocket连接已关闭');
				},
				fail: (err) => {
					console.error("wss关闭失败->", err)
				}
			});
			clearInterval(this.heartbeatTimer);
			this.ws = null;
		}
	}
}
export default websocketUtils;

使用

javascript 复制代码
let socket = new websocketUtils(wss_.url, false, {
		heartbeatInterval: 5000,
		reconnectInterval: 3000,
		reconnectAttempts: 5
});

socket.onMessage = function(evt) {
  //获取消息
};

socket.send(message);//发送消息
socket.close();//关闭sockett
相关推荐
发光小北32 分钟前
四路can转WIFI在现场应用中有什么问题?
网络协议
2501_9159090611 小时前
iOS应用从开发到上架App Store的完整发布流程与步骤指南
android·ios·小程序·https·uni-app·webview
刘马想放假11 小时前
网络链路备份与高可用技术详解:从 Dual-WAN、LACP 到 SD-WAN 与 MPTCP
网络协议
Zelman12 小时前
第07章-数据中心网络
后端·网络协议
不爱说话郭德纲13 小时前
从“点点点”到一键出包:我把 uni-app x Android 离线打包做成了脚本
android·前端·uni-app
imDwAaY13 小时前
WebSocket 和 SSE 有什么区别?从实时通信到 AI 流式输出
后端·websocket
网络小江15 小时前
上网第四十八课:抓包实战入门——Wireshark 读懂第一个包
网络协议
墨香幽梦客15 小时前
SSL/TLS握手过程全拆解:从ClientHello到Finish的关键步骤与性能优化
网络协议·性能优化·ssl
snotJam15 小时前
关于Uniapp的Android自定义基座使用
android·uni-app
神一样的老师16 小时前
WS63 访问 HTTPS 握手失败(-0x7780)根治
数据库·网络协议·https