您的位置:首页 > 新闻 > 资讯 > vue3+ts封装websocket工具类

vue3+ts封装websocket工具类

2025/2/23 14:31:20 来源:https://blog.csdn.net/qq_59625204/article/details/140998913  浏览:    关键词:vue3+ts封装websocket工具类

封装代码如下:

type EventHandler<T> = (event: T) => void;class WebSocketTool {private ws: WebSocket | null = null;private url: string;private isOpen: boolean = false;private readonly pingTimeout: number = 10000;private readonly pongTimeout: number = 1000;private pingTimeoutId: ReturnType<typeof setTimeout> | null = null;private pongTimeoutId: ReturnType<typeof setTimeout> | null = null;private isReconnecting: boolean = false;private reconnectTimeout: number = 1000;public onopen: EventHandler<Event> | null = null;public onclose: EventHandler<CloseEvent> | null = null;public onmessage: EventHandler<MessageEvent> | null = null;public onerror: EventHandler<Event> | null = null;constructor(url: string) {this.url = url;this.connect();}private connect(): void {this.ws = new WebSocket(this.url);this.ws.onopen = event => this.handleOpen(event);this.ws.onclose = event => this.handleClose(event);this.ws.onerror = event => this.handleError(event);this.ws.onmessage = event => this.handleMessage(event);}private handleOpen(event: Event): void {if (this.ws?.readyState != 1) {return;}this.isOpen = true;if (this.onopen) {this.onopen(event);}this.startHeartbeat();}private handleMessage(event: MessageEvent): void {if (this.onmessage) {this.onmessage(event);}this.resetHeartbeat();this.startHeartbeat();}private handleClose(event: CloseEvent): void {this.isOpen = false;if (this.onclose) {this.onclose(event);}}private handleError(event: Event): void {if (this.onerror) {this.onerror(event);}this.reconnect();}private reconnect(): void {if (this.isReconnecting) return;this.isReconnecting = true;setTimeout(() => {this.connect();this.isReconnecting = false;}, this.reconnectTimeout);}private startHeartbeat(): void {this.pingTimeoutId = setTimeout(() => {if (this.isOpen) {this.resetHeartbeat();return;}this.pongTimeoutId = setTimeout(() => {console.log("心跳超时,准备重连");this.reconnect();}, this.pongTimeout);}, this.pingTimeout);}private resetHeartbeat(): void {if (this.pingTimeoutId) {clearTimeout(this.pingTimeoutId);}if (this.pongTimeoutId) {clearTimeout(this.pongTimeoutId);}}public send(message: string): void {if (this.ws && this.isOpen) {this.ws.send(message);} else {console.error("WebSocket 连接未打开,无法发送消息");}}public close(): void {if (this.ws) {this.ws.close();}this.resetHeartbeat();}
}export default WebSocketTool;

页面使用时:

// 建立webSocket连接
const ws = new WebSocketTool("/websocket?Authorization=" + token);
ws.onopen = (event: Event) => {console.log("WebSocket 连接已打开", event);
};
ws.onmessage = (event: MessageEvent) => {const message = JSON.parse(event.data);console.log("收到消息:", message);
};
ws.onclose = (event: CloseEvent) => {console.log("WebSocket 连接已关闭:", event);
};
ws.onerror = (event: Event) => {console.log("WebSocket 错误:", event);
};

页面销毁时:

onBeforeUnmount(() => {// 关闭连接ws.close();
});

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com