Node.js中监听8999端口WebSocket服务需使用什么库?
解决方案:在app.ts中实现WebSocket客户端并实时更新前端
首先,你不需要额外安装新库——你已经在app.ts里引入了ws,这个库既可以用来搭建WebSocket服务端(就像你在server.ts里做的那样),也可以作为客户端连接到已有的WebSocket服务端。当然,如果还没安装ws的TypeScript类型定义,可以补装一下:
npm install @types/ws --save-dev
接下来我给你两种实用方案,按需选择即可:
方案一:app.ts中转WebSocket数据,通过SSE实时推送给前端
适合需要在app.ts中对WebSocket消息做额外处理(比如过滤、格式转换)后再推送给前端的场景。
第一步:修改app.ts代码
import * as express from 'express'; import * as WebSocket from 'ws'; const app = express(); // 设置EJS模板引擎(需先安装:npm install ejs) app.set('view engine', 'ejs'); app.set('views', './views'); // 新建views目录存放前端模板 // 存储最新收到的WebSocket消息 let latestServerMessage = ''; // 创建WebSocket客户端,连接到8999端口的服务端 const wsClient = new WebSocket('ws://localhost:8999'); wsClient.on('open', () => { console.log('✅ 已连接到8999端口的WebSocket服务端'); wsClient.send('来自app.ts客户端的问候'); }); wsClient.on('message', (data) => { const message = data.toString(); console.log('📥 收到服务端消息:', message); latestServerMessage = message; // 更新最新消息 }); wsClient.on('error', (err) => { console.error('❌ WebSocket客户端出错:', err); }); wsClient.on('close', () => { console.log('🔌 与WebSocket服务端断开连接'); }); // 主页路由,渲染初始页面 app.get('/', (req, res) => { res.render('index', { initialMessage: latestServerMessage }); }); // SSE接口,用于向前端实时推送消息 app.get('/sse', (req, res) => { res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); res.setHeader('Connection', 'keep-alive'); // 先发送当前最新消息 res.write(`data: ${JSON.stringify({ message: latestServerMessage })}\n\n`); // 监听WebSocket新消息,推送给前端 const pushMessage = (data: WebSocket.Data) => { res.write(`data: ${JSON.stringify({ message: data.toString() })}\n\n`); }; wsClient.on('message', pushMessage); // 客户端断开连接时清理监听 req.on('close', () => { wsClient.off('message', pushMessage); res.end(); }); }); app.listen(3000, () => console.log("🌐 Web应用已在3000端口启动"));
第二步:创建前端模板文件
在项目根目录新建views/index.ejs,内容如下:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>实时消息更新</title> </head> <body> <h2>来自WebSocket服务端的实时消息</h2> <div id="message-box" style="padding: 1rem; border: 1px solid #ddd; min-height: 50px;"> <%= initialMessage || '等待消息...' %> </div> <script> const messageBox = document.getElementById('message-box'); // 连接SSE接口 const eventSource = new EventSource('/sse'); eventSource.onmessage = (event) => { const { message } = JSON.parse(event.data); messageBox.textContent = message; }; eventSource.onerror = (err) => { console.error('SSE连接出错:', err); eventSource.close(); messageBox.textContent = '连接中断,请刷新页面'; }; </script> </body> </html>
方案二:前端直接连接WebSocket服务端(更简洁高效)
如果不需要在app.ts中处理消息,直接让前端连接8999端口的服务端是最优选择,省去中转环节,性能更好。
修改app.ts的主页路由
app.get('/', (req, res) => { res.send(` <!DOCTYPE html> <html> <head> <title>实时WebSocket消息</title> </head> <body> <h2>实时消息</h2> <div id="message-box">等待连接...</div> <script> const ws = new WebSocket('ws://localhost:8999'); const messageBox = document.getElementById('message-box'); ws.onopen = () => { messageBox.textContent = '已连接到服务端'; }; ws.onmessage = (event) => { console.log('收到服务端消息:', event.data); messageBox.textContent = event.data; }; ws.onerror = (err) => { console.error('WebSocket错误:', err); messageBox.textContent = '连接出错'; }; ws.onclose = () => { messageBox.textContent = '已断开连接'; }; </script> </body> </html> `); });
总结
- 核心依赖就是你已经引入的
ws库,它同时支持WebSocket服务端和客户端功能,完全满足你的需求。 - 如果后续需要更丰富的实时通信能力(比如房间管理、自动重连),可以考虑使用
socket.io,但当前场景下ws足够轻量实用。
内容的提问来源于stack exchange,提问作者xiaolingxiao
相关产品推荐
相关产品推荐

