首页 > 其他分享 >1_websocket工具封装

1_websocket工具封装

时间:2024-06-11 11:54:28浏览次数:11  
标签:封装 连接 event 关闭 websocket 工具 message const

Websocket

1 构造函数

  • new WebSocket(url[, protocols])

  • 参数

    • url:要连接到的 URL
    • protocols:单个协议字符串或协议字符串数组

2 实例属性

  • binaryType:接收的二进制数据的类型

    • blob
    • arraybuffer
  • readyState:websocket 连接的当前状态

readyState 值 mean 解释
0 connecting 已创建 socket,连接尚未打开
1 open 连接打开且已做好通信准备
2 closing 连接正在关闭
3 closed 连接已关闭

3 实例方法

  • close():关闭连接

    • close(code, reason)

    • 参数

      • code :指示关闭原因
        • 1000:正常关闭
        • 1001-1015:指示实际原因
  • send(data):发送数据

4 事件

  1. close:websocket 连接关闭时触发 close 事件

    • addEventListener("close", (event) => {});

    • onclose = (event) => {};

    • 属性

      • code:服务器发送的关闭代码
      • reason:服务器关闭连接的原因
      • wasClean:是否已完全关闭
  2. error:与 websocket 连接由于错误而关闭时触发 error 事件

    • addEventListener("error", (event) => {});
    • onerror = (event) => {};
  3. message:websocket 接收到数据时触发 message 事件

    • addEventListener("message", (event) => {});

    • onmessage = (event) => {};

    • 属性

      • data
      • origin:消息来源
  4. open:与 websocket 建立连接时触发 open 事件

    • addEventListener("open", (event) => {});
    • onopen = (event) => {};
import { useState, useRef, useEffect } from 'react';

interface WebSocketOptions {
  url: string;
  onOpen?: () => void;
  onMessage?: (message: any) => void;
  onClose?: (event: Event) => void;
  one rror?: (event: Event) => void;
  reconnectInterval?: number;
  reconnectAttrmpts?: number;
}

const defaultOptions: Required<WebSocketOptions> = {
  url: '', // 连接的长连接
  onOpen: () => {}, // 开启连接
  onMessage: () => {}, // 消息
  onClose: () => {}, // 关闭连接
  one rror: () => {}, // 异常
  reconnectInterval: 1000, // 重连时长设置
  reconnectAttrmpts: Number.MAX_VALUE // 最大连接范围数
};

const useWebsocket = (options: WebSocketOptions): [WebSocket | undefined, (message: any) => void, string, boolean] => {
  const { url, onOpen, onClose, onMessage, one rror, reconnectInterval, reconnectAttrmpts } = {
    ...defaultOptions,
    ...options
  };

  const [isConnected, setIsConnected] = useState(false); // 是否连接
  const [reconnectCount, setReconnectCount] = useState(0); // 是否重连
  const [newMessage, setNewMessage] = useState(''); // 最新消息

  const wsRef = useRef<WebSocket>();
  const reconnectTimerRef = useRef<NodeJS.Timer>();

  const connect = () => {
    setIsConnected(false);

    const ws = new WebSocket(url);

    // 与 websocket 建立连接时触发
    ws.onopen = () => {
      console.log('----------websocket is connected---------');
      setIsConnected(true);
      setReconnectCount(0);
      onOpen();
    };

    // websocket 接收到数据时触发
    ws.onmessage = event => {
      const message: any = JSON.parse(event.data);
      console.log(`----------websocket reveived message: ${message}--------------`);
      setNewMessage(event.data);
      onMessage(message);
    };

    // websocket 连接关闭时触发
    ws.onclose = event => {
      console.error(`-----------wesocket closed with code ${event.code}-----------`);
      setIsConnected(false);
      onClose(event);

      // 是否重新连接
      // if (reconnectCount < reconnectAttrmpts) {
      //   reconnectTimerRef.current = setTimeout(() => {
      //     setReconnectCount(prevCount => prevCount + 1);
      //     connect();
      //   }, reconnectInterval);
      // }
    };

    // 与 websocket 连接由于错误而关闭时触发
    ws.onerror = event => {
      console.error(`websocket error:`, event);
      onClose(event);
    };
    wsRef.current = ws;
  };

  useEffect(() => {
    connect();
    return () => {
      // 关闭连接
      wsRef.current?.close();
      clearTimeout(reconnectTimerRef.current);
    };
  }, []);

  const sendMessage = (message: any): void => {
    if (isConnected && wsRef.current) {
      console.log(`-------websocket sending message: ${JSON.stringify(message)}--------`);
      // 发送数据
      wsRef.current.send(JSON.stringify(message));
    } else {
      console.error('cannot send message - websocket is not connected');
    }
  };

  return [wsRef.current, sendMessage, newMessage, isConnected];
};
export default useWebsocket;

标签:封装,连接,event,关闭,websocket,工具,message,const
From: https://www.cnblogs.com/pleaseAnswer/p/18241820

相关文章

  • Redis的监控与调优:工具使用和性能提升技巧
    I.引言A.介绍Redis的重要性,以及为什么需要对Redis进行监控和调优 Redis是一种内存数据结构存储系统,它支持多种数据类型,如字符串、列表、集合、哈希表等,并提供了丰富的操作命令。Redis的高性能和灵活性使其在许多场景中都发挥了重要作用,例如,作为缓存降低数据库的访问压......
  • 封装线程池相关函数
    thread_pool.c线程要执行的任务/*******************************************************************************************@name:routine* @function:线程要执行的任务*@paramsv:None*@retval:None*@author:Dazz*@d......
  • 三个pdf工具和浏览软件(pdftk,muppdf,epdfview)
    安装pdftkpdftk是一款功能强大的PDF处理工具,主要用于对PDF文件进行各种操作。它提供了丰富的功能,包括但不限于合并、拆分、旋转、加密、解密、添加水印、从PDF文档中解出附件等。pdftk分为图形界面版本和命令行版本,适用于不同的用户需求。安装pkginstallpdftk软件需要下......
  • 【JS封装-兼容IE(较旧版本如IE8及以下)】强化编程实践:精选JavaScript函数封装集锦-添加E
    目录添加Event监听获取非行间样式JSON.parse与JSON.stringifyquerySelector与querySelectorAll的兼容支持跨浏览器的classList操作兼容性处理console.log兼容性处理forEach方法Promise的兼容性处理FetchAPI的兼容性处理添加Event监听IE8及以下版本不支持addEvent......
  • AI作画工具介绍
    目录1.概述2.StableDiffusion2.1.诞生背景2.2.版本历史2.3.优点2.4.缺点2.5.应用场景2.6.未来展望3.Midjourney3.1.诞生背景3.2.版本历史3.3.优点3.4.缺点3.5.应用场景3.6.未来展望4.总结1.概述AI作画工具是一种运用人工智能技术,特别是深度学习和生成对抗......
  • QT工具uic、moc、rcc
    QT中的moc、uic、rcc在学习QT的过程中接触到了moc、uic、rcc这几个名词moc(Meta-ObjectCompiler),元对象编译器,用于处理QT拓展的C++语法uic(UserInterfaceCompiler),用户界面编译器,将根据.ui文件生成相应的.h文件,例如根据mainwindow.ui生成ui_mainwindow.hrcc(ResourceComp......
  • nvm介绍、nvm下载、nvm安装、配置及nvm使用,nodejs安装,版本管理切换工具,轻松地管理多个
    1.卸载以前的Nodejs1.1.控制面板>卸载程序1.2.找到后右键卸载1.3.删除node的安装目录和此目录下包含npm的文件1.4.打开命令行检查是否删除成功出现这个说明已经删除成功2.NVM下载当使用nvm(NodeVersionManager)安装Node,js时,您可以轻松......
  • Git分布式版本控制工具
    了解Git基本概念git是一个免费开源的分布式版本控制系统,它使用一个叫做仓库的数据库来记录文件的变化,仓库中的每个文件都有一个完整的版本历史记录。可以看到谁在什么时间修改了哪些文件的哪些内容。现在最流行的版本控制系统有两种,一种是集中式版本控制系统:SVN、CVS等等;另一种......
  • PowerToys使用教程 的基本情况,并开始使用其中的实用工具;PowerToys 的功能和使用方法,提
    PowerToys的初级使用教程大纲:介绍PowerToys什么是PowerToysPowerToys是由微软推出的一组实用工具集合,旨在为Windows用户提供增强功能和工作效率。PowerToys的初衷是为开发人员、技术爱好者和高级用户提供更多的定制化选项和工具,以改善其在Windows操作系统上的......
  • Webpack等打包工具是怎么实现启动本地服务器,并且实时预览并更新的
    在代码中使用webpack来作为构建工具,使用npmrunserver也就是webpackserver的时候,会启动一个开发服务器,会运行类似于打包的行为(在这里我们比喻成打包),转换成可以直接运行的代码,这写代码不会生成文件,而是会运行在内存中,然后webpack会给你一个本地的地址,可以直接在浏览......