Node.js 中的原生 WebSocket 客户端

介绍

Node.js v21 起,WebSocket API 已通过 Undici 库得到增强,引入了内置的 WebSocket 客户端。这简化了 Node.js 应用程序的实时通信。在 Node.js v22.4.0 版本中,WebSocket API 被标记为稳定,表明它已准备好用于生产环境。

什么是 WebSocket

WebSocket 是一种标准化的通信协议,它允许在单个 TCP 连接上进行双向同步通信。它具有全双工或双向能力,这使其区别于 HTTP。WebSocket 通过使用 HTTP Upgrade 头来转换协议,从而实现与 HTTP 的兼容性。它允许服务器在没有初始请求的情况下向客户端推送内容,并保持开放连接以进行持续的消息交换,这使其成为实时数据传输的理想选择,其开销比 HTTP 轮询等替代方案更低。WebSocket 通信通常通过 TCP 端口 443(安全)或 80(不安全)进行,这有助于绕过防火墙对非 Web 连接的限制。该协议定义了自己的 URI 方案(ws:// 和 wss://),分别用于未加密和加密的连接,并得到所有主流浏览器的支持。

原生 WebSocket 客户端

Node.js 现在可以充当 WebSocket `客户端`,而无需依赖 wssocket.io 等外部库来进行客户端连接。这使得 Node.js 应用程序可以直接发起和管理传出的 WebSocket 连接,从而简化了连接到实时数据源或与其他 WebSocket 服务器交互等任务。用户现在可以使用标准的 new WebSocket() 构造函数创建 WebSocket 客户端连接。

在上述基础上,让我们添加更多实际示例来演示新的 WebSocket 客户端功能,展示基本用例。

基本连接和消息处理

// Creates a new WebSocket connection to the specified URL.
const socket = new WebSocket('ws://:8080');

// Executes when the connection is successfully established.
socket.addEventListener('open', event => {
  console.log('WebSocket connection established!');
  // Sends a message to the WebSocket server.
  socket.send('Hello Server!');
});

// Listen for messages and executes when a message is received from the server.
socket.addEventListener('message', event => {
  console.log('Message from server: ', event.data);
});

// Executes when the connection is closed, providing the close code and reason.
socket.addEventListener('close', event => {
  console.log('WebSocket connection closed:', event.code, event.reason);
});

// Executes if an error occurs during the WebSocket communication.
socket.addEventListener('error', error => {
  console.error('WebSocket error:', error);
});

发送和接收 JSON 数据

const socket = new WebSocket('ws://:8080');

socket.addEventListener('open', () => {
  const data = { type: 'message', content: 'Hello from Node.js!' };
  socket.send(JSON.stringify(data));
});

socket.addEventListener('message', event => {
  try {
    const receivedData = JSON.parse(event.data);
    console.log('Received JSON:', receivedData);
  } catch (error) {
    console.error('Error parsing JSON:', error);
    console.log('Received data was:', event.data);
  }
});

上面的 `json` 代码演示了发送和接收 JSON 数据,这在 WebSocket 应用程序中很常见。它使用 JSON.stringify() 在发送前将 JavaScript 对象转换为 JSON 字符串,并使用 JSON.parse() 将接收到的字符串转换回 JavaScript 对象。最后,它还包括了对 JSON 解析的错误处理。

这减少了依赖管理并提高了兼容性。开发人员可以避免安装和维护额外的 WebSocket 客户端库。内置实现符合现代 Web 标准,确保了更好的互操作性。此增强功能专注于 WebSocket 通信的客户端,使 Node.js 能够充当 WebSocket 客户端。

重要须知

Node.js v22 提供内置的原生 WebSocket 服务器实现。要创建接受来自 Web 浏览器或其他客户端的传入连接的 WebSocket 服务器,仍需要使用像 wssocket.io 这样的库。这意味着虽然 Node.js 现在可以轻松连接到 WebSocket 服务器,但它仍然需要外部工具才能成为一个 WebSocket 服务器。

总结

Node.js v22 使应用程序能够作为`客户端`与 WebSocket 服务器无缝交互,但在 Node.js 中创建 WebSocket 服务器仍然依赖于已有的库。对于开发人员在 Node.js 项目中实现实时通信时,理解这一区别至关重要。