ts + websocket封装

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

1,使用方式

// 开始链接websocket
const ws = websocket({
    url: '/websocket',
    onmessage: e => {
        // 获取websocket信息
        console.log(e)
    }
})

// 关闭websocket
ws.close()

2,源码如下

// 定义定时器
type TimeoutHandle = ReturnType<typeof setTimeout>

// 定义回调函数
interface Fn<T = any, R = T> {
    (...arg: T[]): R
}

// 定义参数
interface IOptions {
	// 链接
	url: string
	// token
	token?: string
	// 发送心跳间隔时间
	heart_time?: number
	//检查链接状态时间
	check_time?: number
	//断线后重连间隔时间
	lock_time?: number
	// 成功回调
	onmessage: Fn<any, any>
	// 失败回调
	onerror?: Fn<any, any>
	// 打开回调
	onopen?: Fn<any, any>
	// 关闭回调
	onclose?: Fn<any, any>
}

// 方法
const websocket = (options: IOptions) => {
	class Ws {
		// socket实例
		public ws: WebSocket | undefined
		// 默认基础地址
		private readonly baseUrl: string = import.meta.env.VITE_WS_BASE_API as string
		// socket 地址
		private readonly url: string | undefined
		// socket请求成功数据返回回调函数
		private readonly onmessage: Fn<any, any>
		// socket请求失败返回回调函数
		private readonly onerror?: Fn<any, any>
		// socket打开回调
		private readonly onopen?: Fn<any, any>
		// socket关闭回调
		private readonly onclose?: Fn<any, any>
		// token
		private readonly token: string | undefined = tokenCookies.get()
		// 心跳时间
		private readonly heart_time: number = 3000
		// 检查连接状态时间
		private readonly check_time: number = 3000
		// 重连时间
		private readonly lock_time: number = 4000
		// 心跳定时器
		private h_timer: TimeoutHandle | undefined
		// 检查连接状态定时器
		private c_timer: TimeoutHandle | undefined
		// 重连定时器
		private l_timer: TimeoutHandle | undefined
		// 重连锁
		private isLock: boolean = false

		constructor(options: IOptions) {
			const { url, token, heart_time, check_time, lock_time } = options
			const { onmessage, onerror, onopen, onclose } = options
			if (!url || !onmessage) {
				const message = !url ? '链接url' : '回调函数onmessage'
				throw new Error(`socket${message}不能为空`)
			}

			// 链接url
			this.url = this.baseUrl + url
			// 数据返回回调函数
			this.onmessage = onmessage
			// 失败回调
			if (!!onerror) {
				this.onerror = onerror
			}
			// 打开回调
			if (!!onopen) {
				this.onopen = onopen
			}
			// 关闭回调
			if (!!onclose) {
				this.onclose = onclose
			}
			// token
			this.token = token || tokenCookies.get()
			// 心跳时间
			this.heart_time = heart_time || 3000
			// 检查连接状态时间
			this.check_time = check_time || 3000
			// 重连时间
			this.lock_time = lock_time || 4000

			// 初始化
			this.wsInit()
		}

		// 初始化socket
		public wsInit(): void {
			if (!this.url || !this.token) {
				return
			}
			// 拼接token
			const url = this.url + '?token=' + this.token
			const ws = new WebSocket(url)

			// 打开处理
			ws.onopen = e => {
				// 心跳
				this.heartCheck()
				// 打开回调
				if (!!this.onopen) {
					this.onopen(e)
				}
			}

			// 关闭处理
			ws.onclose = e => {
				// 重连
				if (!!this.token) {
					this.reconnect()
				}
				// 关闭回调
				if (!!this.onclose) {
					this.onclose(e)
				}
			}

			// 错误处理
			ws.onerror = e => {
				// 重连
				if (!!this.token) {
					this.reconnect()
				}
				// 回调
				if (!!this.onerror) {
					this.onerror(e)
				}
			}

			// 消息接收
			ws.onmessage = e => {
				// 心跳
				this.heartCheck()
				// 回调
				this.onmessage(e)
			}

			// 赋值
			this.ws = ws
		}

		// 心跳
		private heartCheck(): void {
			// 清除心跳、检查连接接定时器
			this.clearTimeout()
			// 心跳定时器
			this.h_timer = setTimeout(() => {
				// 发送ping
				;(this.ws as WebSocket).send('type:ping')
				// 检查连接状态定时器,确认连接状态
				this.c_timer = setTimeout(() => {
					// 连接失败,进行关闭
					if ((this.ws as WebSocket).readyState !== 1) {
						this.close()
					}
				}, this.check_time)
			}, this.heart_time)
		}

		// 重连
		private reconnect(): void {
			if (this.isLock) {
				return
			}

			this.isLock = true
			this.l_timer && clearTimeout(this.l_timer)
			// 重连定时器
			this.l_timer = setTimeout(() => {
				this.wsInit()
				this.isLock = false
			}, this.lock_time)
		}

		// 清除心跳、检查连接状态定时器
		private clearTimeout(): void {
			this.h_timer && clearTimeout(this.h_timer)
			this.c_timer && clearTimeout(this.c_timer)
		}

		// 销毁关闭
		public close(): void {
			// 关闭WebSocket
			;(this.ws as WebSocket).close()
			// 清除心跳、检查连接接定时器
			this.clearTimeout()
		}
	}

	return new Ws(options)
}
export default websocket

文章来源地址https://www.toymoban.com/news/detail-821401.html

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

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

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

相关文章

  • WebSocket | 基于TCP的全双工通信网络协议

    ​🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法,初步涉猎Python人工智能开发和前端开发。 🦅主页:@逐梦苍穹 📕所属专栏:Java EE ✈ 您的一键三连,是我创作的最大动力🌹 WebSocket 是基于 TCP 的一

    2024年02月19日
    浏览(74)
  • 【Java】网络通信基础、协议分层及封装分用

    网络互连的目的是进行网络通信,也就是网络数据传输,更具体一点,是网络主机中的不同进程间基于网络来传输数据。 ip地址表示了主机在网络上的地址,类似于收发快递时的收件人地址和发件人地址。 端口号表示了主机中某一个进程,使用网络的进程在启动时系统会分配

    2024年02月11日
    浏览(36)
  • 【JavaEE初阶】网络原理|认识协议|协议分层|TCP/IP模型|封装和分用

    目录 一、认识协议 1.概念 2.作用(为什么需要协议?) 二、协议分层 1.为什么需要⽹络协议的分层? 2. 协议分层是什么 3.分层带来的好处 三、TCP/IP五层(或四层)模型 (1)物理层 (2)数据链路层 (3)网络层 (4)传输层 (5)应用层 四、封装和分用(协议的层和层之间

    2024年04月23日
    浏览(40)
  • 持久双向通信网络协议-WebSocket-入门案例实现demo

    1 介绍 WebSocket 是基于 TCP 的一种新的 网络协议 。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建 持久性 的连接, 并进行 双向 数据传输。 HTTP协议和WebSocket协议对比: HTTP是 短连接 (一次响应完即消除) WebSocket是 长连接

    2024年01月16日
    浏览(45)
  • 网络通信协议-HTTP、WebSocket、MQTT的比较与应用

    在今天的数字化世界中,各种通信协议起着关键的作用,以确保信息的传递和交换。HTTP、WebSocket 和 MQTT 是三种常用的网络通信协议,它们各自适用于不同的应用场景。本文将比较这三种协议,并探讨它们的主要应用领域。 HTTP (超文本传输协议) HTTP  是最常见的协议之一

    2024年02月05日
    浏览(58)
  • 【JavaEE】网络初识 (IP地址, 端口号, 协议, 封装和分用)

    本章来介绍一下网络中的一些基本概念, 例如 : IP地址, 端口号, 协议, 协议分层, 封装, 分用等等. 网络互联的目的是进行网络通信, 即进行网络数据传输, 更具体一点, 是网络主机的不同进程间, 基于网络传输数据. 那么在组建的网络中是如何判断从哪台主机, 将数据传输到哪一台

    2024年01月21日
    浏览(40)
  • 网络编程1—— IP地址 + 端口号 +TCP/IP协议 + 协议分层的封装与应用

    本人是一个刚刚上路的IT新兵,菜鸟!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果这篇文章可以帮助到你,劳请大家点赞转发支持一下! 从本篇文章开始就要分享网络编程的内容了,越发的感受到了编程的魅力,鸡汤来喽!! 1️⃣单机阶段:计算机跟计算

    2024年02月12日
    浏览(40)
  • 【尚医通】vue3+ts前端项目开发笔记 2 —— 创建项目、封装网络请求、集成elment-plus 、重置样式、准备状态管理/路由 等开发前准备

    服务器地址:http://syt.atguigu.cn 医院接口:http://139.198.34.216:8201/swagger-ui.html 公共数据接口:http://139.198.34.216:8202/swagger-ui.html 会员接口:http://139.198.34.216:8203/swagger-ui.html 短信验证码接口:http://139.198.34.216:8204/swagger-ui.html 订单接口:http://139.198.34.216:8206/swagger-ui.html 文件上传接口:

    2024年02月13日
    浏览(49)
  • 前端面试:【网络协议与性能优化】HTTP/HTTPS、TCP/IP和WebSocket

    嗨,亲爱的Web开发者!在构建现代Web应用时,了解网络协议是优化性能和确保安全性的关键。本文将深入探讨HTTP/HTTPS、TCP/IP和WebSocket这三个网络协议,帮助你理解它们的作用以及如何优化Web应用的性能。 1. HTTP/HTTPS协议: HTTP(超文本传输协议): HTTP是用于在Web上传输数据的

    2024年02月11日
    浏览(48)
  • 网络协议安全:OSI七层模型分层及作用,数据封装与解封过程,数据传输过程。

    「作者简介」: 2022年北京冬奥会中国代表队,CSDN Top100,学习更多干货,请关注专栏《网络安全自学教程》 这一章节我们需要知道OSI分哪七层,每层的作用,知道数据在七层模型中是怎样传输的,封包和解封过程,数据包在每一层是怎么封装和解封的。 OSI(Open System Interc

    2024年04月26日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包