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
相关产品推荐
相关产品推荐

