webSocket使用及vue中封装使用(客户端和服务端搭建)

当时由于c++同事当时出差,于是自学了webSocket并用node搭建了一个简单的服务端用来自己调试,当时就感觉到求人不如求己啊。
P.s:参考的有网上的文章,珠峰全栈里的webSocket、黑马pink老师B站里的另一个老师的实战项目课程里的

webSocket相关基础内容请查看

内容待更新

一、搭建node服务端

1、安装node环境
2、安装nodejs-websocket

控制台输入命令

npm install nodejs-websocket
3、新建socket.js文件

socket.js

const ws = require("nodejs-websocket");
console.log("开始建立连接...")

const socket = ws.createServer(function(conn){
   
   
    conn.on("text", function (str) {
   
   
        console.log("message:"+str)
        let msg = "你好,这里是是日前端~"
        // let msg = 'websocket处于正常状态'
        setInterval(() => {
   
   
            conn.sendText(msg);
        }, 3000)
    })
    conn.on("close", function (code, reason) {
   
   
        console.log("关闭连接")
    });
    conn.on("error", function (code, reason) {
   
   
        console.log("异常关闭", code, reason)
    });
}).listen(8666)
console.log("WebSocket建立完毕")

module.exports = socket

4、运行该js文件看到如下日志即可

<think>我们正在讨论Vue2中封装WebSocket。用户需要知道如何创建一个WebSocket封装文件,并在Vue组件中使用它。根据参考引用[^1]:WebSocket允许服务主动向客户端推送数据,浏览器和服务器只需要完成一次握手,就可以创建持久性的连接并进行双向数据传输。思路:1.创建一个WebSocket封装模块(WebSocket.js),这个模块应该提供连接、发送消息、关闭连接以及处理事件(如onopen,onmessage,onerror,onclose)的功能。2.在Vue组件中使用这个模块,通常我们会在组件的生命周期钩子(如created或mounted)中初始化WebSocket连接,并在销毁组件时(beforeDestroy)关闭连接。具体步骤:第一步:创建WebSocket.js文件我们可以创建一个类,封装WebSocket的基本操作。第二步:在Vue组件中引入并使用这个类。第三步:考虑重连机制、心跳机制等(可选,根据需求)下面是一个基本的封装示例:WebSocket.js文件内容:```javascriptexportdefaultclassWebSocketService{/***构造函数*@param{string}urlWebSocket服务器的URL*@param{Function}messageCallback接收到消息时的回调函数*@param{Function}[openCallback]连接建立时的回调函数*@param{Function}[errorCallback]发生错误时的回调函数*@param{Function}[closeCallback]连接关闭时的回调函数*/constructor(url,messageCallback,openCallback,errorCallback,closeCallback){this.url=url;this.messageCallback=messageCallback;this.openCallback=openCallback;this.errorCallback=errorCallback;this.closeCallback=closeCallback;this.socket=null;}//连接WebSocketconnect(){this.socket=newWebSocket(this.url);//当连接建立this.socket.onopen=()=>{console.log('WebSocketconnected');if(this.openCallback){this.openCallback();}};//当接收到消息this.socket.onmessage=(event)=>{//调用回调函数,将消息传递出去this.messageCallback(event.data);};//当发生错误this.socket.onerror=(error)=>{console.error('WebSocketerror:',error);if(this.errorCallback){this.errorCallback(error);}};//当连接关闭this.socket.onclose=(event)=>{console.log('WebSocketclosed:',event);if(this.closeCallback){this.closeCallback(event);}};}//发送消息send(message){if(this.socket&&this.socket.readyState===WebSocket.OPEN){this.socket.send(message);}else{console.error('WebSocketisnotconnected.');}}//关闭连接close(){if(this.socket){this.socket.close();}}}```在Vue组件中的使用示例(比如在src/components/SomeComponent.vue中):```vue<template><div><!--在这里使用WebSocket接收的数据--><divv-for="(message,index)inmessages":key="index">{{message}}</div></div></template><script>importWebSocketServicefrom'../utils/WebSocket.js';//根据实际路径调整exportdefault{data(){return{messages:[],wsService:null};},created(){//创建WebSocketService实例this.wsService=newWebSocketService('ws://your-websocket-server-url',this.handleMessage,this.handleOpen,this.handleError,this.handleClose);//连接WebSocketthis.wsService.connect();},beforeDestroy(){//组件销毁前关闭WebSocket连接if(this.wsService){this.wsService.close();}},methods:{handleMessage(data){//处理收到的消息,这里简单地将消息存入数组this.messages.push(data);},handleOpen(){console.log('WebSocketopened');},handleError(error){console.error('WebSocketerror:',error);},handleClose(event){console.log('WebSocketclosed:',event);},//如果需要发送消息,可以调用wsService.send()sendMessage(message){if(this.wsService){this.wsService.send(message);}}}};</script>```注意事项:1.请将`ws://your-websocket-server-url`替换为实际的WebSocket服务器地址。2.根据实际需求调整回调函数中的处理逻辑。3.如果需要在多个组件中使用同一个WebSocket连接,可以考虑将WebSocket服务实例放在Vuex中管理,或者使用单例模式。扩展:重连机制在实际应用中,我们可能需要处理网络断开后的重连。可以在`handleClose`方法中判断是否需要重连(比如非主动关闭导致的断开),然后使用`setTimeout`尝试重新连接。以上是一个基本的封装使用方法。根据具体需求,还可以增加心跳机制来保持连接活跃。现在,生成相关问题:</think>### Vue2 中封装使用 WebSocket.js 文件 在 Vue2 中封装 WebSocket 可提高代码复用性和可维护性。以下是完整的封装方案: #### 1. 创建 WebSocket 封装文件(`src/utils/websocket.js`) ```javascript export default class WebSocketService { constructor(url) { this.url = url; this.socket = null; this.reconnectAttempts = 0; this.maxReconnect = 5; this.listeners = { open: [], message: [], error: [], close: [] }; } // 初始化连接 connect() { this.socket = new WebSocket(this.url); this.socket.onopen = (event) => { this.reconnectAttempts = 0; // 重置重连计数 this.emit('open', event); }; this.socket.onmessage = (event) => { try { const data = JSON.parse(event.data); // 自动解析 JSON this.emit('message', data); } catch (e) { this.emit('message', event.data); // 非 JSON 数据直接传递 } }; this.socket.onerror = (error) => { this.emit('error', error); this.reconnect(); }; this.socket.onclose = (event) => { if (!event.wasClean) { this.reconnect(); } this.emit('close', event); }; } // 自动重连机制 reconnect() { if (this.reconnectAttempts < this.maxReconnect) { setTimeout(() => { this.reconnectAttempts++; this.connect(); }, 3000 * this.reconnectAttempts); // 指数退避策略 } } // 发送消息 send(data) { if (this.socket?.readyState === WebSocket.OPEN) { const payload = typeof data === 'object' ? JSON.stringify(data) : data; this.socket.send(payload); } } // 事件监听 on(event, callback) { if (this.listeners[event]) { this.listeners[event].push(callback); } } // 事件触发 emit(event, ...args) { this.listeners[event]?.forEach(cb => cb(...args)); } // 关闭连接 close() { if (this.socket) { this.socket.close(); this.socket = null; } } } ``` #### 2. 在 Vue 组件中使用 ```vue <template> <div> <button @click="sendMessage">发送测试消息</button> <div v-for="(msg, index) in messages" :key="index"> {{ msg }} </div> </div> </template> <script> import WebSocketService from '@/utils/websocket'; export default { data() { return { ws: null, messages: [] }; }, mounted() { this.initWebSocket(); }, beforeDestroy() { if (this.ws) this.ws.close(); // 组件销毁时关闭连接 }, methods: { initWebSocket() { this.ws = new WebSocketService('wss://your-websocket-server'); // 注册事件监听 this.ws.on('open', () => { console.log('WebSocket 已连接'); }); this.ws.on('message', (data) => { this.messages.push(data); }); this.ws.on('error', (err) => { console.error('WebSocket 错误:', err); }); this.ws.connect(); // 启动连接 }, sendMessage() { this.ws.send({ type: 'test', content: 'Hello WebSocket!' }); } } }; </script> ``` #### 关键特性说明 1. **自动重连机制**:当连接异常断开时,采用指数退避算法自动重连(最多 5 次) 2. **智能数据处理**:自动解析 JSON 格式消息,保留原始数据格式 3. **事件驱动架构**:通过 `on()` 方法注册事件监听器,实现解耦 4. **资源管理**:组件销毁时自动关闭连接,避免内存泄漏 5. **错误处理**:内置错误事件传递和重连策略 #### 使用场景建议 1. **实时数据展示**:股票行情、实时监控 2. **即时通讯**:聊天应用、通知系统 3. **多人协作**:在线文档、协同编辑 4. **游戏应用**:实时状态同步 > **注意事项**: > - 生产环境应使用 `wss://` 安全协议 > - 重要操作需添加消息确认机制 > - 高频数据场景需考虑节流/防抖 > - 服务断开时需处理用户提示 WebSocket 实现了浏览器与服务器的持久化连接,允许双向实时数据传输,避免了 HTTP 轮询的资源消耗[^1]。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值