You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:09:52