You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 01:50:03