Uniapp 中使用 WebSocket:封装、心跳检测与 Node.js 服务端实现
WebSocket 是一种全双工通信协议,广泛应用于实时通信场景(如聊天、实时数据推送等)。本文将详细介绍如何在 Uniapp 中封装 WebSocket、实现心跳检测,并基于 Node.js 搭建一个简单的 WebSocket 服务端。
1. Uniapp 中 WebSocket 的封装
核心功能
- 连接 WebSocket 服务器。
- 发送和接收消息。
- 实现心跳检测,确保连接稳定性。
封装代码
以下是一个简单的 WebSocket 封装示例:
export default class Socket { constructor(url) { this.url = url; // WebSocket 服务器地址 this.socket = null; // WebSocket 实例 this.heartbeatInterval = 30000; // 心跳间隔时间(30秒) this.reconnectInterval = 5000; // 重连间隔时间(5秒) this.isConnected = false; // 连接状态 } // 连接 WebSocket connect() { this.socket = new WebSocket(this.url); // 监听连接成功 this.socket.onopen = () => { this.isConnected = true; console.log('WebSocket connected'); this.startHeartbeat(); // 开启心跳检测 }; // 监听接收消息 this.socket.onmessage = (event) => { console.log('Received message:', event.data); // 处理接收到的消息 }; // 监听连接关闭 this.socket.onclose = () => { this.isConnected = false; console.log('WebSocket disconnected'); this.reconnect(); // 尝试重连 }; // 监听连接错误 this.socket.onerror = (error) => { console.error('WebSocket error:', error); }; } // 发送消息 send(message) { if (this.isConnected) { this.socket.send(JSON.stringify(message)); } else { console.error('WebSocket is not connected'); } } // 开启心跳检测 startHeartbeat() { this.heartbeatTimer = setInterval(() => { if (this.isConnected) { this.send({ type: 'heartbeat' }); // 发送心跳消息 } }, this.heartbeatInterval); } // 重连 reconnect() { clearInterval(this.heartbeatTimer); // 清除心跳定时器 setTimeout(() => { console.log('Reconnecting...'); this.connect(); // 重新连接 }, this.reconnectInterval); } // 关闭连接 close() { if (this.socket) { this.socket.close(); clearInterval(this.heartbeatTimer); // 清除心跳定时器 } } }
使用示例
import Socket from './socket.js'; const socket = new Socket('ws://localhost:8080'); socket.connect(); // 发送消息 socket.send({ type: 'message', content: 'Hello, WebSocket!' }); // 关闭连接 // socket.close();
2. WebSocket 心跳检测
作用
- 检测连接是否正常,避免因网络问题导致连接断开。
- 保持连接活跃,防止被服务器主动关闭。
实现原理
- 客户端定时向服务器发送心跳消息(如 { type: 'heartbeat' })。
- 服务器收到心跳消息后,可以返回响应或不做处理。
- 如果客户端长时间未收到心跳响应,则尝试重连。
3. Node.js WebSocket 服务端实现
实现步骤
-
初始化项目
在项目目录下运行以下命令,生成 package.json 文件:
npm init -y
-
安装 ws 模块
运行以下命令安装 WebSocket 库:
npm install ws
-
创建 WebSocket 服务端
以下是一个简单的 WebSocket 服务端实现,每隔 5 秒向客户端发送一条消息:
const WebSocket = require('ws'); const wss = new WebSocket.Server({ port: 8080 }); wss.on('connection', function connection(ws) { console.log('A new client connected'); // 监听客户端消息 ws.on('message', function incoming(message) { console.log('Received message:', message.toString()); }); // 每隔 5 秒向客户端发送一条消息 setInterval(() => { if (ws.readyState === WebSocket.OPEN) { ws.send('Get message from server'); } }, 5000); }); console.log('WebSocket server is running on ws://localhost:8080');
运行服务端
- 将上述代码保存为 server.js,然后运行以下命令启动服务端:
node server.js
4. 前后端通信原理
核心流程
- 建立连接:客户端通过 new WebSocket(url) 连接服务端。
- 发送消息:客户端和服务端通过 send() 方法发送消息。
- 接收消息:通过 onmessage 事件监听接收到的消息。
- 关闭连接:通过 close() 方法关闭连接。
(图片来源网络,侵删)(图片来源网络,侵删)(图片来源网络,侵删)
-
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。