信 言 不 美 , 美 言 不 信 。善 者 不 辩 , 辩 者 不 善 。知 者 不 博 , 博 者 不 知 。 天 门 开 阖 , 能 为 雌 乎 。明 白 四 达 , 能 无 知 乎 。《道德经》第八十一章
简介
因为 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 分为两个部分:
- 客户端
- 服务端
// nodejs 环境
npm install socket.io
或者使用 html
<script src="socket.io.js"></script>
在 nestjs 中集成 socket.io
- 额外的包支持
- @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
- 完善