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

Dart流式HTTP请求响应问题:实时推送未按预期生效

Dart 长连接分块响应问题:客户端需等待连接关闭才接收数据

我尝试用HttpServer和Shelf两种方案搭建Dart服务器,同时用HttpClient编写客户端,想要建立持续HTTP连接实现服务器主动向客户端推送事件更新,要求响应分块发送而非缓冲。但两次测试中,客户端都要等连接关闭后才能打印收到的数据。

HttpServer 服务器实现

var httpsServer = await io.HttpServer.bind("127.0.0.1", 4001);
httpsServer.listen((request) async {
    request.response.bufferOutput = false;
    request.response.headers.add("Content-Type", "text/event-stream");
    request.response.headers.add("Cache-Control", "no-cache");
    request.response.headers.add("Connection", "keep-alive");

    // 每100ms异步写入"Hello"
    Timer.periodic(Duration(milliseconds: 100), (Timer timer) {
      try {
        request.response.write("Hello\n");
      } catch (_) {
        timer.cancel();
      }
    });
    await Future.delayed(Duration(seconds: 3));
    request.response.close();
});

Shelf 服务器实现

void main() async {
    var handler = const Pipeline().addMiddleware(logRequests()).addHandler(_echoRequest);
    var server = await serve(handler, '127.0.0.1', 4000);
    server.autoCompress = true;
}

FutureOr<Response> _echoRequest(Request request) {
  Stream<List<int>> stream = Stream.periodic(Duration(milliseconds: 100), (int i) {
    return utf8.encode("Hello\n");
  }).take(10);
  return Response.ok(stream);
}

客户端代码

void main() async {
  HttpClient client = HttpClient()..badCertificateCallback = ((X509Certificate cert, String host, int port) => true);
  HttpClientRequest request = await client.postUrl(Uri.parse('https://---/'));
  request.headers.add('Content-Type', 'text/event-stream');
  HttpClientResponse response = await request.close();
  // 将字节流转换为字符串流
  Stream<String> stream = response.transform(utf8.decoder).transform(const LineSplitter());
  await for (String line in stream) {
    print(line);
  }
}

请问是我的实现存在问题,还是应该使用其他库或方案?


内容的提问来源于stack exchange,提问作者Konstanius EU

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 23:35:18