VUE Websocket封装

这篇具有很好参考价值的文章主要介绍了VUE Websocket封装。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.Websocket文件封装

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

封装中包括websocket初始化,向后端发送消息,前端接受消息,心跳检测,关闭websocket等功能文章来源地址https://www.toymoban.com/news/detail-664470.html

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)
			},

        }

到了这里,关于VUE Websocket封装的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于Vue3封装一个好用的Websocket

    在Vue3中使用Websocket可以让我们轻松地实现实时数据传输。为了方便使用,我们可以封装一个好用的Websocket类。 首先我们需要安装 ws 库来处理Websocket连接,使用以下命令进行安装: 我们可以新建一个 websocket.js 文件,在其中定义一个 Websocket 类,代码如下: 以上代码中,我们

    2024年02月04日
    浏览(77)
  • 在vue项目中webSocket封装(传token)

            在websocket中,目前未提供修改请求头字段的方法,参考其他的一些文章,依照他们的写法依然未能实现传递token,所有我和后端另辟蹊径,把token传在路径里面。         这样写就可以长久的建立链接。

    2024年04月29日
    浏览(20)
  • vue3使用websocket简易封装,包含错误重连机制

    websocket实现的全双工通信,真真太香了,以下是笔者在使用时,自己封装的一个简易js工具。若需要源码,请移步这里 笔者这里会重连3次,重连的过程给与用户提示,3次之后会提示用户手动刷新 这里与后端约定的数据返回,加上type作为接口判断依据,因此这里不一定通用。

    2024年02月11日
    浏览(33)
  • vue2 封装 webSocket 开箱即用(或 uni.connectSocket)

    第一步:    下载 webSocket  第二步:   需要在 main.js 中 引入  第三步:     封装相关的连接和断开    相关代码!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  第四步:  引入使用 到这步接收信息已经OK了(记得和后端配合)    使用

    2024年02月09日
    浏览(33)
  • Vue3封装全局WebSocket;全局可监听、可发送、心跳处理等;

    操作如下 可以在多个页面多个组件中进行监听/发送 代码简介 方便; 首先安装 tools-javascript 以及 tools-vue3 根据你的业务需求初始化 ws 在你的任何文件中直接调用即可 附加篇(也可不读 直接看文档 )

    2024年02月11日
    浏览(31)
  • ai问答:vue3+pinia+WebSocket 封装断线重连(实战)

    把 Socket 实例 挂载到全局 为方便梳理,请忽略 typescript ,一切尽在注释中 Socket封装(断线重连) 这个 WebSocket 类封装了 WebSocket 的连接、重连、发送数据等方法。 在 connect 方法中,它会连接 WebSocket ,并绑定相关事件监听。 在 onclose 事件中,它会调用 reconnect 方法进行重连。 recon

    2024年02月03日
    浏览(44)
  • webSocket前端+webSocket封装

    一、websocket基础 2.使用(vue)

    2024年02月15日
    浏览(31)
  • 前端实现websocket通信讲解(vue2框架)

    前言 :最近接到的需求是前端需要实现一个全局告警弹窗,如果使用ajax请求http接口只能用定时器定时去请求是否有告警,这样既消耗资源,又不能实时监测到告警信息。所以这个时候就可以采用websocket来实现通信,因为websocket不用请求一次才响应一次,它可以实现服务器主

    2024年02月12日
    浏览(27)
  • sanic 使用websocket与前端vue通信,持续发送信息

    由于sanic使用较少,很难获取到有效信息,而且对websocket也是挺“一窍不通”的,因此写一下总结。在使用过程中,对sanic注册websocket,还是使用socketio不清。前端vue是使用io,还是WebSocket还是VueSocketIO。 API:sanic.add_websocket_route是Sanic框架自带的一个方法,用于添加WebSocket路由

    2024年02月11日
    浏览(55)
  • Vue.js WebSocket 整合指南:实时通信的完美解决方案

    WebSocket是一种在Web应用程序中实现双向通信的通信协议,它允许客户端和服务器之间建立持久的、低延迟的连接,以实现实时数据传输。相比传统的HTTP请求,WebSocket更适合需要实时性和交互性的应用程序。 WebSocket解决了传统HTTP请求的一些限制,例如: 实时性: 传统HTTP请求需

    2024年02月04日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包