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 client,而无需依赖 wssocket.io 等外部库进行客户端连接。 这允许 Node.js 应用程序直接启动和管理传出的 WebSocket 连接,从而简化了连接到实时数据源或与其他 WebSocket 服务器交互等任务。 用户现在可以使用标准 new WebSocket() 构造函数创建 WebSocket 客户端连接。

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

基本连接和消息处理

// Creates a new WebSocket connection to the specified URL.
const socket = new WebSocket('ws://localhost: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://localhost: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 服务器作为 clients 进行交互,但 Node.js 中 WebSocket 服务器的创建仍然依赖于已建立的库。 对于开发人员来说,在他们的 Node.js 项目中实现实时通信时,理解这种区别至关重要。