FoalTS WebSocket实时通信技术详解
什么是WebSocket通信
WebSocket是一种在单个TCP连接上进行全双工通信的协议,它使得客户端和服务器之间的数据交换变得更加简单。FoalTS框架从2.8版本开始提供了对WebSocket的支持,基于socket.io v4库实现。
核心优势
- 支持双向实时通信
- 自动处理连接断开和重连
- 兼容代理和负载均衡器
- 提供与HTTP类似的控制器和钩子机制
快速开始
服务端配置
首先需要安装依赖:
npm install @foal/socket.io
创建WebSocket控制器示例:
import { EventName, ValidatePayload, SocketIOController, WebsocketContext, WebsocketResponse } from '@foal/socket.io';
export class WebsocketController extends SocketIOController {
@EventName('create product')
@ValidatePayload({
additionalProperties: false,
properties: { name: { type: 'string' }},
required: [ 'name' ],
type: 'object'
})
async createProduct(ctx: WebsocketContext, payload: { name: string }) {
const product = new Product();
product.name = payload.name;
await product.save();
// 广播消息给所有客户端
ctx.socket.broadcast.emit('refresh products');
return new WebsocketResponse();
}
}
客户端实现
客户端需要使用socket.io-client库:
npm install socket.io-client@4
基本客户端代码:
import { io } from 'socket.io-client';
const socket = io('ws://localhost:3001');
socket.on('connect', () => {
socket.emit('create product', { name: 'product 1' }, response => {
if (response.status === 'error') {
console.log(response.error);
}
});
});
socket.on('refresh products', () => {
console.log('收到产品刷新通知');
});
架构设计
控制器与事件处理
FoalTS的WebSocket架构与HTTP架构非常相似:
- 使用
@EventName
装饰器代替HTTP的@Get
、@Post
等 - 控制器方法接收
WebsocketContext
上下文对象 - 可以返回
WebsocketResponse
或WebsocketErrorResponse
子控制器组织
可以通过子控制器组织代码结构:
export class WebsocketController extends SocketIOController {
subControllers = [
wsController('users', UserController)
];
}
上下文对象
WebsocketContext
包含以下重要属性:
socket
: 底层的socket.io连接对象eventName
: 当前事件名称payload
: 请求负载数据state
: 可用于存储请求级别的数据user
: 认证用户信息session
: 会话信息
高级功能
消息广播
可以向所有连接的客户端广播消息:
ctx.socket.broadcast.emit('event_name', message);
房间机制
Socket.io提供了房间概念,可以将客户端分组:
// 加入房间
ctx.socket.join('room_name');
// 向特定房间发送消息
ctx.socket.to('room_name').emit('event_name');
负载验证
使用@ValidatePayload
装饰器验证请求数据:
@ValidatePayload({
properties: { name: { type: 'string' }},
required: ['name'],
type: 'object'
})
错误处理
未捕获的错误会自动转换为WebsocketErrorResponse
,可以通过重写handleError
方法自定义错误处理逻辑。
生产环境建议
多节点部署
在生产环境中使用Redis适配器支持多节点部署:
import { createAdapter } from '@socket.io/redis-adapter';
export class WebsocketController extends SocketIOController {
adapter = createAdapter(pubClient, subClient);
}
连接管理
使用onConnection
方法处理新连接:
onConnection(ctx: WebsocketContext) {
// 初始化连接逻辑
}
测试策略
测试WebSocket控制器与测试HTTP控制器类似,可以构造WebsocketContext
对象:
const ctx = new WebsocketContext('event_name', payload);
性能优化
可以通过配置socket.io选项优化性能:
options = {
connectTimeout: 60000,
// 其他优化选项
}
FoalTS的WebSocket实现提供了强大而灵活的实时通信能力,开发者可以轻松构建需要实时数据交换的应用程序,如聊天应用、实时协作工具等。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考