Notes

使用 Node 创建 WebSocket

在 Node 平台上搭建 WebSocket 服务,使用的比较多的是 ws 模块

ws 模块包含了 WebSocket 的服务端与客户端的创建,但客户端不支持浏览器的使用

下面使用的是 ws + TypeScript 的组合来开发一个 Demo, Demo 包含了服务端与客户端(命令行)

使用 TypeScript 开发,是因为 TypeScript 由 API 描述的“头文件”,更加容易理解 ws 模块的使用方法

服务端

过程描述

import * as ws from 'ws';

// 创建一个 WebSocket 服务器,监听的是 30002 端口
const webSocketServer = new ws.Server({
  port: 30002,
});

// 监听的是 WebSocket 服务开始监听的事件
webSocketServer.on('listening', (socket: ws) => {
  console.log('web socket begins listening');
});

// 监听的是 WebSocket 服务被客户端连接上的事件
webSocketServer.on('connection', (socket: ws, req) => {

  // 监听的是 服务端收到了客户端发来的消息 事件
  socket.on('message', (data) => {
    console.log(data);
    if (data === 'terminate') {
      socket.close();
      setTimeout(() => {
        webSocketServer.close();
      }, 3000);
    }
  });

  // 监听的是,服务端收到了客户端关闭连接的事件,由客户端发起的关闭
  socket.on('close', (code, reason) => {
    console.log(code);
    console.log(reason);
  });

  // 监听的是,WebSocket 通信过程中出错的事件
  socket.on('error', (error: Error) => {
    console.log('error:');
    console.log(error);
  });

  const ip = req.connection.remoteAddress;
  console.log(ip + ' is connected');
  socket.send('hi');
});

connection 事件监听中

客户端

过程描述

import * as ws from 'ws';

// 创建 WebSocket 客户端,连接的是本机的 30002 的 WebSocket 服务
const webSocketClient = new ws('ws://127.0.0.1:30002');

// 监听的是 客户端获知 WebSocket 连接成功后的事件
webSocketClient.on('open', () => {
  console.log('web socket opened');
});

// 监听的是 客户端收到了来自服务端的消息
webSocketClient.on('message', (data) => {
  console.log(data);

  setTimeout(() => {
    webSocketClient.send('terminate');
  }, 5000);
});

// 监听的是 通信过程中出错的事件
webSocketClient.on('error', (error: Error) => {
  console.log(error);
});

// 监听的是 WebSocket 连接被关闭的事件,由服务端发起的关闭
webSocketClient.on('close', () => {
  console.log('???');
});

// 监听的是 收到来自服务端的心跳检测 ping 的事件
webSocketClient.on('ping', (data) => {
  console.log('ping' + data);
});

// 监听的是 收到来自服务端的收到心跳检测 pong 的事件
webSocketClient.on('pong', (data) => {
  console.log('pong' + data);
});

最后

ws 模块的 Github 页面由很详细的使用方法说明