如何使用Dart SseHandler向所有连接客户端发送消息
解决SSE客户端管理与消息推送问题
1. 自行维护客户端连接列表
SseHandler的connections是一个Stream,仅会推送新建立的连接,而非已存在的连接集合。你需要主动监听这个Stream,将每个新连接存入自定义列表,同时处理连接断开的清理逻辑:
// 全局维护SSE连接列表 final List<SseConnection> sseConnections = []; // 初始化时监听新连接 void initSseConnections() { sseHandler.connections.listen((connection) { // 添加新连接到列表 sseConnections.add(connection); // 监听连接关闭事件,及时从列表移除无效连接 connection.onClose.then((_) { sseConnections.remove(connection); }); }); }
2. 向所有客户端发送消息
修改sendMessagesSse方法,直接遍历自定义的连接列表即可,无需再从Stream中获取:
void sendMessagesSse(String message) { print("sending message... $message"); // 创建列表副本,避免遍历过程中列表修改引发异常 for (final conn in List.from(sseConnections)) { try { conn.sink.add(message); } catch (e) { // 处理发送失败(如连接已断开) print("Failed to send message: $e"); sseConnections.remove(conn); } } }
3. 实现定期推送消息
保留你的周期定时器逻辑,但需先调用initSseConnections完成连接监听初始化:
int count = 0; void startMessageGeneratorSse() { // 先初始化连接监听 initSseConnections(); Timer.periodic(const Duration(milliseconds: 1000), (timer) { count++; // SSE包会自动处理消息格式,无需手动添加"data:"前缀 sendMessagesSse("Message number $count"); }); }
关键注意事项
- 遍历连接列表时务必创建副本,避免因连接断开修改原列表导致遍历异常。
- 必须监听连接的
onClose事件,及时清理无效连接,防止内存泄漏和发送失败。 - SSE消息无需手动拼接
data:前缀,包会自动处理格式,直接传入内容字符串即可。
内容的提问来源于stack exchange,提问作者Vipul
相关产品推荐
相关产品推荐

