🤝🤝🤝WebSocket 相关

526 阅读2分钟

信 言 不 美 , 美 言 不 信 。善 者 不 辩 , 辩 者 不 善 。知 者 不 博 , 博 者 不 知 。 天 门 开 阖 , 能 为 雌 乎 。明 白 四 达 , 能 无 知 乎 。《道德经》第八十一章

简介

因为 HTTP 是无状态的,独立,单向的,所以要实现双向通信,效果并不理想。在这个过程诞生过如下的技术:

  • 轮询技术
  • AJAX/Comet
  • nodejs 相关
  • nestjs 相关
  • GrapgQL 相关

WebSocket 始于 H5 标准,是一种双向通信技术。本质是通过 HTTP、HTTPS 发送链接请求,创建握手,然后创建一条 TCP 链接,此后websocket就不在需要 http/https, 客户端和服务端都是通过 TCP 链接进行信息交互的。

websocket 的优点,是通过事件监听的方式,来处理 TCP 链接:

  • onopen 监听打开事件
  • onmessage 监听消息事件
  • onclose 进行关闭事件
  • onerror 监听错误事件

WebSocket 的使用场景

1.实时通信的一般都需要使用 websocket,如多人游戏,多人聊天室等,需要同步的内容。但是 websocket 是 H5 的标准,其实兼容肯定是有问题的。兼容性的问题其实也被解决了: SocketIO.

SocketIO将WebSocket、AJAX和其它的通信方式全部封装成了统一的通信接口,也就是说,在使用SocketIO时,不用担心兼容问题,底层会自动选用最佳的通信方式。因此说,WebSocket是SocketIO的一个子集。

在不同的端集成 SocketIO

SocketIO 分为两个部分:

  1. 客户端
  2. 服务端
// nodejs 环境
npm install socket.io

或者使用 html

<script src="socket.io.js"></script>

在 nestjs 中集成 socket.io

  1. 额外的包支持
  • @nestjs/platform-express
  • @nestjs/platform-socket.io
  • @nestjs/websockets
  • @types/socket.io

我们需要单独的创建一个事件文件用于管理 EventsGateway 类, 这个类需要被 WebSocketGateway 装饰器进行修饰,EventsGateway中要包含 Server类型的变量,被WebSocketServer 修饰,

每一函数对应一个事件,被 SubscribeMessage修饰,参数就是需要出的事件,MessageBody 用于解析事件。返回值 data 就是返回给前端的数据

// events.gateway.ts
import {
  MessageBody,
  SubscribeMessage,
  WebSocketGateway,
  WebSocketServer,
  WsResponse,
} from '@nestjs/websockets';
import { from, Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { Server } from 'socket.io';

@WebSocketGateway()
export class EventsGateway {
  @WebSocketServer()
  server: Server;

  @SubscribeMessage('events')
  findAll(@MessageBody() data: any): Observable<WsResponse<number>> {
    console.log(data);
    return from([1, 2, 3]).pipe(map(item => ({ event: 'events', data: item })));
  }

  @SubscribeMessage('identity')
  async identity(@MessageBody() data: number): Promise<number> {
    console.log('identity', data);
    return data;
  }
}

推荐使用单独的 EventsModule 模块,管理 socket,然后将 EventsModule 引入到主模块中。

api

  • socket.on 监听事件
    • connect
    • events
    • exception
    • disconnect
  • 触发事件 socket.emit

todo

  • 完善