首页 > 其他分享 >webSocket拿来即用

webSocket拿来即用

时间:2025-01-18 09:28:45浏览次数:3  
标签:webSocket msg 即用 心跳 heartbeat 拿来 重连 连接

使用时只需将代码写入组件中,引入即可使用

<template></template>
<script>
import { mapGetters } from 'vuex';
export default {
	data() {
		return {
			webSocket: null, // webSocket实例
			lockReconnect: false, // 重连锁,避免多次重连
			maxReconnect: -1, // 最大重连次数, -1 标识无限重连
			reconnectTime: 0, // 重连尝试次数
			heartbeat: {
				interval: 10 * 1000, // 心跳间隔时间
				timeout: 5 * 1000, // 响应超时时间
				pingTimeoutObj: null, // 延时发送心跳的定时器
				pongTimeoutObj: null, // 接收心跳响应的定时器
				pingMessage: JSON.stringify({ type: 'ping' }) // 心跳请求信息
			}
		};
	},

	computed: {
		...mapGetters(['userInfo'])
	},
	methods: {
		initWebSocket() {
			// ws地址
			// let wsUri = `ws://${window.location.hostname}:8899/iothub`;
			let wsUri = `ws://192.168.5.141:8899/iothub`;
			// 建立连接
			this.webSocket = new WebSocket(wsUri);
			// 连接成功
			this.webSocket.onopen = this.onOpen;
			// 连接错误
			this.webSocket.onerror = this.onError;
			// 接收信息
			this.webSocket.onmessage = this.onMessage;
			// 连接关闭
			this.webSocket.onclose = this.onClose;
		},
		/**
		 * 重新连接
		 */
		reconnect() {
			if (
				this.lockReconnect ||
				(this.maxReconnect !== -1 && this.reconnectTime > this.maxReconnect)
			) {
				return;
			}
			this.lockReconnect = true;

			setTimeout(() => {
				this.reconnectTime++;
				// 建立新连接
				this.initWebSocket();
				this.lockReconnect = false;
			}, 5000);
		},
		/**
		 * 清空定时器
		 */
		clearTimeoutObj: function (heartbeat) {
			heartbeat.pingTimeoutObj && clearTimeout(heartbeat.pingTimeoutObj);
			heartbeat.pongTimeoutObj && clearTimeout(heartbeat.pongTimeoutObj);
		},
		/**
		 * 开启心跳
		 */
		startHeartbeat() {
			const webSocket = this.webSocket;
			const heartbeat = this.heartbeat;
			// 清空定时器
			this.clearTimeoutObj(heartbeat);
			// 延时发送下一次心跳
			heartbeat.pingTimeoutObj = setTimeout(() => {
				// 如果连接正常
				if (webSocket.readyState === 1) {
					//这里发送一个心跳,后端收到后,返回一个心跳消息,
					console.log(heartbeat.pingMessage);

					webSocket.send(heartbeat.pingMessage);
					// 心跳发送后,如果服务器超时未响应则断开,如果响应了会被重置心跳定时器
					heartbeat.pongTimeoutObj = setTimeout(() => {
						webSocket.close();
					}, heartbeat.timeout);
				} else {
					// 否则重连

					this.reconnect();
				}
			}, heartbeat.interval);
		},
		/**
		 * 连接成功事件
		 */
		onOpen() {
			console.log('WebSocket connection success');
			//开启心跳
			this.startHeartbeat();
			this.reconnectTime = 0;
			// 用户上线
			let msg = JSON.stringify({
				type: 'up',
				uid: this.userInfo.userId,
				from: 'user'
			});

			this.send(msg);
		},
		/**
		 * 连接失败事件
		 * @param e
		 */
		onError(e) {
			//错误
			console.log(
				`WebSocket connection error:${e.code} ${e.reason} ${e.wasClean}`
			);
			//重连
			this.reconnect();
		},
		/**
		 * 连接关闭事件
		 * @param e
		 */
		onClose(e) {
			//关闭
			console.log(
				`WebSocket connection closed:${e.code} ${e.reason} ${e.wasClean}`
			);
			//重连
			// this.reconnect();
		},
		/**
		 * 接收服务器推送的信息
		 * @param msgEvent
		 */
		onMessage(msgEvent) {
			//收到服务器信息,心跳重置并发送
			this.startHeartbeat();
			const text = msgEvent.data;
			let res;
			if (text == 'pong') {
				return;
			} else if (text == 'upOver') {
				// this.$notify.success({
				// 		title: '消息提醒',
				// 		message: "打印服务已就绪",
				// 		offset: 60
				// 	});
			} else {
				console.log('收到服务器信息:', msgEvent);
				res = JSON.parse(msgEvent.data);
				if (res.success) {
					// 成功并更新数据
					this.$emit('SocketSuccess', res);
				} else {
					this.$notify.warning({
						title: this.$t('消息提醒'),
						dangerouslyUseHTMLString: true,
						message: res.msg,
						offset: 60
					});
					this.$emit('SocketFail');
				}
			}
		},
		/**
		 * 数据发送
		 * @param msg
		 */
		send(msg) {
			//数据发送
			this.webSocket.send(msg);
		}
	}
};
</script>

标签:webSocket,msg,即用,心跳,heartbeat,拿来,重连,连接
From: https://blog.csdn.net/weixin_45580774/article/details/145182157

相关文章

  • 你在工作中有用到过websocket吗?用它来解决什么问题?
    是的,我在工作中用到过WebSocket。WebSocket是一种网络通信协议,允许服务器与客户端之间进行双向通信。在前端开发中,我使用WebSocket主要解决以下问题:实时数据更新:在需要实时数据更新的应用场景中,WebSocket非常有用。例如,在开发实时股票价格更新系统时,我使用WebSocket来实时接收......
  • 你知道什么是websocket吗?它有什么应用场景?
    WebSocket是一种在Web应用中实现双向通信的协议。它建立在TCP协议之上,与传统的HTTP请求-响应模型不同,WebSocket允许服务器主动向客户端推送数据,为实时数据交互提供了可能。以下是关于WebSocket的详细介绍及其应用场景:一、WebSocket的特点:双向通信:WebSocket提供了服务器与客户端......
  • 【Go】万字长文解析:使用Go语言的WebSocket实现一个群聊聊天室项目
    本文目录一、背景介绍二、后端代码1、data.go2、server.go3、hub.go4、connection.go为什么c可以直接给h的通道发送数据?为什么reader不需要go协程开启?5、后端流程6、一些难点部分怎么理解hub?一个新用户上线的过程?三、前端代码一、背景介绍本文是近期为了参加......
  • websocket-sharp:.NET平台上的WebSocket客户端与服务器开源库
    推荐一个C#开发的,实现WebSocket功能的开源项目。01项目简介websocket-sharp提供WebSocket客户端和服务器库,基于C#开发的,并遵循WebSocket协议规范,使得开发人员能够轻松地在.NET应用程序中实现WebSocket通信。websocket-sharp特色功能有:1、简洁易用的API:提供清晰且......
  • 开箱即用!一款支持多个大语言模型服务的桌面客户端!
    大家好,我是Java陈序员。可以说现在AI给我们的生活、工作带来了极大的便利,各种大语言模型层出不穷,功能多样。今天,给大家介绍一款支持多模型服务的桌面客户端,开箱即用!关注微信公众号:【Java陈序员】,获取开源项目分享、AI副业分享、超200本经典计算机电子书籍等。项目介绍Ch......
  • 使用websocket写一个发布评论和删除评论的功能
    这里我后端是使用gin框架来写的,这里我直接上代码:在上代码前,我们先进行websocket和gin框架以及gorm框架和mysql驱动的安装:goget-ugithub.com/gin-gonic/gingoget-ugithub.com/gorilla/websocketgoget-ugorm.io/gormgoget-ugorm.io/driver/mysql首先是前......
  • (即插即用模块-Attention部分) 四十一、(2023) MLCA 混合局部通道注意力
    文章目录1、MixedLocalChannelAttention2、代码实现paper:MixedlocalchannelattentionforobjectdetectionCode:https://github.com/wandahangFY/MLCA1、MixedLocalChannelAttention现有通道注意力机制的局限性:大多数通道注意力机制只关注通道特征信......
  • YoloV8改进:注意力改进|Block改进|ESSAformer,用于高光谱图像超分辨率的高效Transformer
    摘要一、论文介绍高光谱图像超分辨率的重要性:高光谱成像技术通过密集采样光谱特征,为材料区分提供丰富的光谱和空间结构信息,广泛应用于各领域。高光谱图像超分辨率(HSI-SR)旨在从低分辨率HSI生成高分辨率HSI。传统方法的局限性:传统方法依赖手工制作的先验,如低秩近似和稀疏......
  • 请讲讲WebSocket如何维持连接?
    WebSocket通过以下几种主要方式来维持连接:心跳机制:WebSocket使用心跳机制来定期发送心跳消息,这些消息可以是空的数据帧或是特定的控制帧,用于确认连接的活跃状态。客户端和服务器通过交换这些心跳消息来确认连接是否仍然有效,这有助于及时发现连接的异常并进行处理。断线......
  • webSocket 握手的原理是什么?
    WebSocket握手的原理主要涉及到客户端和服务器之间通过HTTP请求和响应来建立WebSocket连接的过程。以下是详细的握手原理:客户端发起握手请求:客户端(通常是Web浏览器)首先发起一个HTTP请求,该请求包含了一些特定的头信息,表明客户端希望建立一个WebSocket连接。这些头信息中关键......