socket
socket模块为客户端和服务器之间提供了双向通信通道。
foolon admin 的 socket 模块/api/src/socket
使用 NestJS 内置的 WEBSOCKET 实现。其底层使用了 Socket.IO。
下面主要介绍 socket 模块的网关和守卫,以及如何获取服务器端实例和已连接的客户端。
网关
socket 模块的网关/api/src/socket/socket.gateway.ts
,实现了 OnGatewayConnection
,OnGatewayInit
,OnGatewayDisconnect
这三个方法。
监听客户端连接、断开连接,以及初始化。并在连接时校验用户是否登录、是否修改密码。
守卫
socket 模块的守卫/api/src/socket/socket.guard.ts
,在用户发送消息时验证用户是否登录、是否修改密码。
获取服务器端实例
具体服务器端实例可参考服务器端API
typescript
import { SocketGateway } from '@/socket/socket.gateway'
class demo {
constructor(private readonly socketGateWay: SocketGateway) {}
demo() {
// 服务器端实例
const server = this.socketGateWay.server
}
}
获取已连接的客户端
具体客户端实例可参考客户端API
typescript
import { SocketGateway } from '@/socket/socket.gateway'
import extractTokenFromHeader from '@/common/utils/extractTokenFromHeader'
class demo {
constructor(private readonly socketGateWay: SocketGateway) {}
demo() {
// 已连接的客户端
const sockets = this.socketGateWay.server.sockets.sockets
// 获取已连接的客户端信息
const userTokens: { token: string; address: string; loginDate: string }[] = []
sockets.forEach((socket) => {
userTokens.push({
token: extractTokenFromHeader(socket.handshake.auth.token),
address: socket.handshake.address,
loginDate: dayjs(socket.handshake.time).format('YYYY-MM-DD HH:mm:ss')
})
})
// 后续可根据token获取每个连接的用户信息
}
}