NodeJS教程

WebSocket 协议和实时通信

Preview
  • Node.js WebSocket 协议和实时通信
  • WebSocket 协议
  • ws 模块
  • WebSocket 客户端
  • 实时通信
  • 总结

Node.js WebSocket 协议和实时通信

WebSocket 是一种基于 TCP 的协议,用于在 Web 浏览器和服务器之间进行双向通信。与传统的 HTTP 协议相比,WebSocket 协议具有更低的延迟和更高的实时性。Node.js 提供了 ws 模块,可以用于创建 WebSocket 服务器和客户端。本文将介绍 WebSocket 协议和 ws 模块的基本使用,以及如何使用 ws 模块实现实时通信。

WebSocket 协议

WebSocket 协议是一种双向通信协议,它支持在 Web 浏览器和服务器之间进行实时通信。WebSocket 协议基于 HTTP 协议,通过在 HTTP 握手阶段升级协议实现。WebSocket 协议的主要特点包括:

  • 双向通信:客户端和服务器可以同时发送和接收数据。
  • 较低的延迟:WebSocket 协议使用长连接,可以减少连接和数据传输的延迟。
  • 较高的实时性:WebSocket 协议可以实时地传输数据,适用于实时通信和在线游戏等场景。

ws 模块

ws 模块是 Node.js 中的一个 WebSocket 库,用于创建 WebSocket 服务器和客户端。使用 ws 模块创建 WebSocket 服务器时,需要先创建一个服务器对象,然后监听 connection 事件,处理客户端 WebSocket 连接。

const WebSocket = require('ws');

const server = new WebSocket.Server({ port: 8080 });

server.on('connection', (socket) => {
  console.log('client connected');
  socket.on('message', (data) => {
    console.log(`received: ${data}`);
  });
  socket.on('close', () => {
    console.log('client disconnected');
  });
});

上面的代码创建了一个 WebSocket 服务器,监听 8080 端口。当客户端连接时,会打印 client connected,并在接收到客户端发送的数据时打印该数据。当客户端断开连接时,会打印 client disconnected

WebSocket 客户端

使用 ws 模块的 WebSocket 类可以创建一个 WebSocket 客户端。客户端连接指定的服务器地址和端口,并在连接成功后触发 open 事件。

const WebSocket = require('ws');

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

socket.addEventListener('open', (event) => {
  console.log('connected to server!');
  socket.send('hello server!');
});

socket.addEventListener('message', (event) => {
  console.log(`received: ${event.data}`);
});

socket.addEventListener('close', (event) => {
  console.log('disconnected from server');
});

上面的代码创建了一个 WebSocket 客户端,连接到 localhost 的 8080 端口。当连接成功时,会打印 connected to server!,并向服务器发送 hello server!。客户端接收到服务器发送的数据时,会打印该数据。当与服务器断开连接时,会打印 disconnected from server

实时通信

使用 ws 模块可以轻松地实现实时通信。下面是一个简单的实时聊天室示例:

const WebSocket = require('ws');

const server = new WebSocket.Server({ port: 8080 });

server.on('connection', (socket) => {
  console.log('client connected');
  socket.on('message', (data) => {
    server.clients.forEach((client) => {
      if (client !== socket && client.readyState === WebSocket.OPEN) {
        client.send(data);
      }
    });
  });
  socket.on('close', () => {
    console.log('client disconnected');
  });
});

上面的代码创建了一个实时聊天室,当客户端发送消息时,服务器会将消息广播给所有连接到服务器的客户端。

总结

本文介绍了 WebSocket 协议和 ws 模块的基本使用,以及如何使用 ws 模块实现实时通信。WebSocket 协议具有较低的延迟和较高的实时性,适用于实时通信和在线游戏等场景。