一个WebSocket的自定义hook

一个WebSocket的自定义hook

自己封装了一个WebSocket的hook,代码如下:

typescript 复制代码
import { useEffect, useContext } from "react";
import { AppContext } from "../../App";
import useSocketHandle from "./useSocketHandle";

const WS_URL = 'wss://xxx' // 服务地址

const useSocket = () => {

    const socketRef = useRef<WebSocket>()

    let heartTimer = 0; // 心跳定时器 ID

    const heartCheck = (socket: WebSocket) => { // 心跳检查
        clearInterval(heartTimer); // 先清除之前的定时器

        heartTimer = setInterval(() => {
            socket.send('xxx'); // 约定好的心跳
        }, 30000);
    }

    const createSocket = () => { // socket创建

        if (socketRef.current) return;

        const socket = new WebSocket(`${WS_URL}`) // 信令服务器连接
        socket.onopen = () => { // 连接建立
            console.log("[ws open] 连接已建立");
            heartCheck(socket);// 心跳处理
        };

        socket.onmessage = async (event) => { // 接收到服务器的信息
          console.log(event)
        };

        socket.onclose = () => { // 连接关闭
            console.log('[ws close] 连接中断');
            socketRef.current = undefined
            clearInterval(heartTimer); // 清除定时器
        };

        socket.onerror = (error) => { // 连接错误
            console.log(`[error] 连接错误 `, error);
        };

        return socket;
    }

    useEffect(() => { // 监听房间
        socketRef.current = createSocket();
        // 关闭socket的方法
      	// socketRef.current.close();
    }, [])

    return socketRef; // 如果不需要的话不返回也是可以的
}

export default useSocket

使用方法如下:

typescript 复制代码
const socketRef = useSocket()
相关推荐
williamdsy37 分钟前
【WebSocket】WebSocket架构重构:从分散管理到统一连接的实战经验
websocket·重构·架构·实战·统一管理
游戏开发爱好者837 分钟前
iOS App上线前的安全防线:项目后期如何用Ipa Guard与其他工具完成高效混淆部署
websocket·网络协议·tcp/ip·http·网络安全·https·udp
用户97436970725281 小时前
Spring Boot 3 + WebSocket STOMP + 集群会话 + Token 认证集成示例
websocket
谢尔登1 小时前
【React】SWR 和 React Query(TanStack Query)
前端·react.js·前端框架
市民中心的蟋蟀1 小时前
第十一章 这三个全局状态管理库之间的共性与差异 【上】
前端·javascript·react.js
菥菥爱嘻嘻2 小时前
React---Hooks深入
前端·javascript·react.js
谢尔登2 小时前
【React】使用 useContext + useReducer 实现一个轻量的状态管理库
前端·javascript·react.js
林太白3 小时前
Next.js超简洁完整篇
前端·后端·react.js
时光足迹3 小时前
电子书阅读器之章节拆分
前端·javascript·react.js
归于尽4 小时前
用火山引擎实现语音生成的实战踩坑与优化
前端·react.js