VUE Websocket封装

1.Websocket文件封装

在utils文件夹下面新建websocket.js文件

封装中包括websocket初始化,向后端发送消息,前端接受消息,心跳检测,关闭websocket等功能

let websock = null
let messageCallback = null
let resCallback = null
let errorCallback = null
let wsUrl = ''
let tryTime = 0
let interval = null
let data = null
let state = false

// 接收ws后端返回的数据
function websocketonmessage(e) {
	if (e.data instanceof Blob && e.data.size === 0) {
		//心跳
		messageCallback(e.data)
	} else {
		//返回数据
		messageCallback(JSON.parse(e.data))
	}
}

/**
 * 发起websocket连接
 * @param {Object} agentData 需要向后台传递的参数数据
 */
function websocketSend(agentData) {
	// 加延迟是为了尽量让ws连接状态变为OPEN
	setTimeout(() => {
		// 添加状态判断,当为OPEN时,发送消息
		if (websock.readyState === websock.OPEN) {
			// websock.OPEN = 1
			// 发给后端的数据需要字符串化
			if (agentData == 'ping') {
                //发送心跳
				const pingMsg = new Uint8Array()
				websock.send(pingMsg)
			} else {
                //发送消息
				websock.send(JSON.stringify(agentData))
			}
		}
		if (websock.readyState === websock.CLOSED) {
			// websock.CLOSED = 3
			console.log('websock.readyState=3', 'ws连接断开')
			clearInterval(interval)
			errorCallback()
		}
	}, 500)
}

//向后端发送消息
export function websocketSendMess(agentData) {
	websock.send(JSON.stringify(agentData))
}

// 关闭ws连接
function websocketclose(e) {
	// e.code === 1000  表示正常关闭。 无论为何目的而创建, 该链接都已成功完成任务。
	// e.code !== 1000  表示非正常关闭。
    //可以根据code情况判断 是否要重连 
	if (e) {
		console.log('ws连接异常,请稍候重试')
		clearInterval(interval)
		errorCallback()
		// 如果需要设置异常重连则可替换为下面的代码,自行进行测试
        //重新连接几次后 是否继续重新 自行判断tryTime
		setTimeout(function () {
			websock = null
			tryTime++
			sendWebsocket(wsUrl, data, messageCallback, resCallback, errorCallback)
			console.log(`第${tryTime}次重连`)
		}, 3 * 1000)
	}
}
// 建立ws连接
function websocketOpen(e) {
	tryTime = 0
	resCallback(e)
}

// 初始化weosocket
function initWebSocket() {
	if (typeof WebSocket === 'undefined') {
		console.log('您的浏览器不支持WebSocket,无法获取数据')
		return false
	}

	// ws请求完整地址
	websock = new WebSocket(wsUrl)

	websock.onmessage = function (e) {
		websocketonmessage(e)
	}
	websock.onopen = function () {
		websocketOpen()
	}
	websock.onerror = function () {
		console.log('ws连接异常,请稍候重试')
		closeWebsocket()
		errorCallback()
	}
	websock.onclose = function (e) {
		websocketclose(e)
	}
}

/**
 * 发起websocket请求函数
 * @param {string} url ws连接地址
 * @param {Object} agentData 传给后台的参数
 * @param {function} successCallback 接收到ws数据,对数据进行处理的回调函数
 * @param {function} errCallback ws连接错误的回调函数
 * @param {function} resorCallback ws连接成功的回调函数
 */
export function sendWebsocket(url, agentData, successCallback, errCallback, resorCallback) {
	wsUrl = url
	data = agentData
	initWebSocket()
	messageCallback = successCallback
	resCallback = resorCallback
	errorCallback = errCallback
	websocketSend(agentData)
	//保持心跳
	clearInterval(interval)
	interval = setInterval(() => {
		websocketSend('ping')
	}, 1000 * 5)
}

/**
 * 关闭websocket函数
 */
export function closeWebsocket() {
	if (websock) {
		clearInterval(interval)
		websock.close() // 关闭websocket
		websock.onclose() // 关闭websocket
	}
}

2.websocket.js引用

import { sendWebsocket, closeWebsocket , websocketSendMess} from '@/utils/websocket.js'
	export default {
		name: 'App',
		data() {
			return {
				wsUrl: process.env.VUE_APP_WEBSOCKET,
				obj: {
					type: 2,
					data: ''
				},
			}
		},

        mounted() {
            this.requstWs()
        },

		methods: {
            //主动关闭ws
            fun1(){
                closeWebsocket()
            },
            //向后端推送消息 
            fun2(){
                websocketSendMess({type:1,data:''})
            }, 
			// ws连接成功,后台返回的ws数据,组件要拿数据渲染页面等操作
			wsMessage(data) {
				const dataJson = data
				this.webState = false
				console.log('接收信息', dataJson)
			},
			// ws连接失败,组件要执行的代码
			wsError() {
				console.log('ws连接失败')
			},
			// ws连接成功,组件要执行的代码
			succeed(e) {
				// console.log('ws连接成功')
			},
			requstWs() {
				// 防止用户多次连续发送,所以要先关闭上次的ws请求。
				closeWebsocket()
				// 跟后端协商,需要什么参数数据给后台
				const obj = this.obj
				// 发起ws请求
				sendWebsocket(this.wsUrl, obj, this.wsMessage, this.wsError,this.succeed)
			},

        }

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue组件中使用WebSocket进行封装的方法如下: 1. 在Vue组件的`<script>`标签中引入WebSocket相关的函数,如`sendWebsocket`和`closeWebsocket`。可以通过`import`语句导入这些函数。 2. 在Vue组件的`methods`中定义WebSocket的相关方法,比如`wsMessage`用于处理接收到的WebSocket数据,`wsError`用于处理WebSocket连接失败的情况。 3. 在需要使用WebSocket的地方调用`sendWebsocket`函数发起WebSocket请求,传入WebSocket的地址以及需要发送的数据。同时,将`wsMessage`和`wsError`方法作为回调函数传入,用于处理成功和失败的情况。 4. 为了避免用户多次连续点击发起请求,需要在调用`sendWebsocket`之前先关闭上次的WebSocket请求,可以调用`closeWebsocket`函数。 5. 可以在组件的`beforeDestroy`生命周期钩子函数中关闭WebSocket连接,以防止页面销毁时WebSocket连接还未完成,可以在需要主动关闭WebSocket的地方调用`closeWebsocket`函数。 请注意,以上是一种常见的封装方式,具体的实现可以根据项目需求进行适当的调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [封装websocket请求-----vue项目实战(完整版)](https://blog.csdn.net/liming1016/article/details/127398367)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [vue websocket组件封装](https://blog.csdn.net/qq_33681891/article/details/114640948)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值