前端 webSocket 封装(开箱即用)

import { ElMessage } from "element-plus";
import { ref } from "vue";
import { websocketURL } from "@/utils/baseConfigs"

export default () => {
    // websocket.value 连接
    const websocket = ref()
    const timer = ref(null)
    const websocketId = ref(null)

    const messageData = ref("")
    const statusFlag = ref(false)
    const getConnection = (val) => {

        websocketId.value = val;
        if(websocketId.value){
            try {
                websocket.value = new WebSocket(
                    `${ websocketURL + "/record/websocket/" + websocketId.value}`
                );
                initwebsocket();
            } catch (error) {
                // console.log("error", error);
            }
        }
    }

    // 初始化socket方法
    const initwebsocket = () => {
        //连接错误
        websocket.value.onerror = setErrorMessage;

        // //连接成功
        websocket.value.onopen = setOnopenMessage;

        //收到消息的回调
        websocket.value.onmessage = setOnmessageMessage;

        //连接关闭的回调
        websocket.value.onclose = setOncloseMessage;

        //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket.value连接,防止连接还没断开就关闭窗口,server端会抛异常。
        window.onbeforeunload = onbeforeunload;
    }
    const setErrorMessage = () => {
        // 连接错误
    }
    const setOnopenMessage = () => {
        // 自定义心跳通信数据
        let obj = {
            userId: websocketId.value
        }
        timer.value = setInterval(() => {
            sendwebsocket(JSON.stringify(obj))
        }, 5 * 1000)
    }
    // 接收后端发的消息
    const setOnmessageMessage = (event) => {
        
        if(event.data === "heartbeat"){
            // 心跳检测
        }else{
            messageData.value = event.data
        }
    }
    const setOncloseMessage = () => {
        // 连接关闭
    }
    const onbeforeunload = () => {
        // 卸载websocket
        closewebsocket();
        statusFlag.value = false;
    }
    //websocket.value发送消息
    const sendwebsocket = (text) => {
        websocket.value.send(text);
    }
    const closewebsocket = () => {
        // 销毁定时任务
        // 销毁websocket心跳检测
        if (timer.value !== null) {
            clearInterval(timer.value);
            timer.value = null;
        }
    }

    return{
        messageData,getConnection,onbeforeunload,statusFlag
    }
}

其他hooks或者组件调用方式

import websocketHooks from "@/hooks/websocketHooks";

const { messageData,getConnection,onbeforeunload } = websocketHooks();

// 创建时候自动连接
onMounted(()=>{
    let timestamp = Date.now();
    // 将时间戳转换为字符串
    let timestampString = timestamp.toString();
    let websocketId = JSON.stringify(userId.value) + timestampString;
    getConnection(websocketId)
})

// 销毁
onBeforeUnmount(()=>{
   onbeforeunload()
})

我们可以使用 JavaScript 中的 `WebSocket` 对象来创建一个 WebSocket 连接,然后封装一些常用的方法来简化操作。以下是一个简单的封装示例: ```javascript class WebSocketClient { constructor(url) { this.url = url; this.websocket = null; this.isConnected = false; this.connect(); } connect() { this.websocket = new WebSocket(this.url); this.websocket.onopen = () => { this.isConnected = true; console.log('WebSocket 连接成功'); }; this.websocket.onmessage = (event) => { console.log('收到消息:', event.data); }; this.websocket.onclose = () => { this.isConnected = false; console.log('WebSocket 连接关闭'); }; this.websocket.onerror = (error) => { console.error('WebSocket 错误:', error); }; } send(message) { if (this.isConnected) { this.websocket.send(message); console.log('发送消息:', message); } else { console.error('WebSocket 连接未建立'); } } close() { if (this.isConnected) { this.websocket.close(); console.log('WebSocket 连接关闭'); } else { console.error('WebSocket 连接未建立'); } } } ``` 使用示例: ```javascript const ws = new WebSocketClient('ws://localhost:8080'); ws.send('Hello, WebSocket!'); ws.close(); ``` 在上面的示例中,我们使用 `WebSocketClient` 类来封装了一个 WebSocket 客户端,提供了 `connect`、`send` 和 `close` 方法。其中,`connect` 方法用于建立 WebSocket 连接,`send` 方法用于发送消息,`close` 方法用于关闭连接。在创建实例时,会自动调用 `connect` 方法来建立连接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值