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
相关推荐
abbgogo5 小时前
TCP/IP、OSI 与常见网络协议知识点总结
网络·网络协议·计算机网络
李昊哲小课5 小时前
fastapi sse websocket 奶茶店实时订单看板
人工智能·python·websocket·网络协议·fastapi·sse
abbgogo7 小时前
堆叠、DHCP 与链路聚合总结
网络·网络协议
波罗丁牌8 小时前
uni-app 实现视频聊天、屏幕分享,支持Android、HarmonyOS、iOS
android·uni-app·音视频
前端l10 小时前
uni‑app(Vue3+setup)开发微信小程序高频坑汇总
微信·uni-app
pan30350747914 小时前
uniapp 不用发版也可以做到版本更新
uni-app
李昊哲小课14 小时前
fastapi sse websocket 智能家居实时控制台
python·websocket·智能家居·fastapi·sse
花生了什么事o15 小时前
WebSocket 与 SSE:实时通信方案的选择
网络·websocket·网络协议
想学好C++的oMen15 小时前
应用层协议http
网络·网络协议·http
00后程序员张15 小时前
使用Instruments工具深入分析iOS应用性能与启动时间优化
android·macos·ios·小程序·uni-app·cocoa·iphone