WebSocket 的使用

WebSocket 的使用,第1张

WebSockets 是一种先进的技术。它可以在用户的浏览器和服务器之间打开交互式通信会话。使用此API,您可以向服务器发送消息并接收事件驱动的响应,而无需通过轮询服务器的方式以获得响应。
https://developer.mozilla.org/zh-CN/docs/Web/API/WebSockets_API

WebSocket 对象提供了用于创建和管理 WebSocket 连接,以及可以通过该连接发送和接收数据的 API。
https://developer.mozilla.org/zh-CN/docs/Web/API/WebSocket

Node.js 事件模块Events
Nodejs中不存在浏览器中冒泡,捕获这些行为,Nodejs中实现了events这个模块,Nodejs中大多数模块都集成了这个模块,所以events是Nodejs中最重要的一个模块。


socket.ts

import { EventEmitter } from "events";
import { useRef } from "react";

const ip = "127.0.0.1"
const SocketHost = `ws:${ip}:8888`;

const getFormatData = (data: any) => {
    try {
        return JSON.parse(data);
    } catch (e) {
        return {};
    }
};

export const useSocket = (url?: string) => {
    const socket = useRef < WebSocket > ();
    //自定义一个对象继承于EventEmitter
    const emitter = useRef < EventEmitter > (new EventEmitter());
    const start = () => {
        if (socket.current) return socket.current;
        // 使用 WebSocket() 构造函数来构造一个 WebSocket 。
        const ws = (socket.current = new WebSocket(
            SocketHost + (url || "/phm/socket/xxx")
        ));
        // event 事件对象上的方法
        const _emitter = emitter.current;
        ws.onopen = () => {
            if (ws.readyState === 1) {
                _emitter.emit("connect");
            }
        };
        // 收到服务器数据后触发的回调函数
        ws.onmessage = (e) => {
            const data = getFormatData(e.data);
            // 触发 message 事件
            _emitter.emit("message", data);
        };
        ws.onclose = () => {
            _emitter.emit("close");
        };
        ws.onerror = (err) => {
            _emitter.emit("onerror");
        };
        return ws;
    };

    return {
        start,
        stop() {
            socket.current && socket.current.close();
        },
        on(name: string, callback: (...args: any[]) => void) {
            // 绑定事件
            emitter.current?.on(name, callback);
            return () => {
                emitter.current?.off(name, callback);
            };
        },
    };
};

index.ts

import { useSocket } from './socket.ts';
const HomePage: React.FC = (props) => {
    const [homeData, setHomedata] = useState({});
    const [extendLogData, setExtendLogData] = useState({});

    const { start, stop, on } = useSocket('/socket/eva-xxx');
    const { start: logStart, stop: logStop, on: logOn } = useSocket('/socket/homepage_xxx')

    useEffect(() => {
        // 绑定 message 事件
        on('message', (data) => {
            setHomedata(data);
        });
        logOn('message', (data) => {
            setExtendLogData(data);
        });

        // 开始连接
        start();
        logStart();

        // 组件销毁时,关闭连接
        return () => {
            stop();
            logStop();
        }
    }, []);
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1324926.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-12
下一篇 2022-06-12

发表评论

登录后才能评论

评论列表(0条)

保存