收到所有数据后关闭流

Close stream after all data has been recieved

我正在尝试发出 HTTP 请求(我知道有一个 http 包可能会使这更容易,但我想学习如何使用 dart:io 来完成)。我下面的代码成功地从 example.com 打印出 index.html,除了程序永远运行,我假设是因为它继续侦听来自响应的数据。从流中接收到所有数据后,如何停止侦听器?我假设我需要将处理程序传递给 onDone 参数,但我不确定是什么。我试着按照下面的方式调用 response.detachSocket(),因为这是我能找到的唯一看起来合乎逻辑的东西,但它没有用。如果不是很明显,我不完全确定我在这里做什么,所以任何解释将不胜感激。

import 'dart:convert';
import 'dart:io';

main() async {
  var client = new HttpClient();
  var request = await client.getUrl(Uri.parse("http://www.example.com/"));
  var response = await request.close();
  response.transform(utf8.decoder).listen((data) {
    print(data);
  }, onDone: () => response.detachSocket());
}

您永远不会关闭 HttpClient。完成后关闭它。流订阅将在完成后自行关闭,onDone 处理程序是流完成时 运行 代码的便捷方式,没有必要使用它来关闭流。

import 'dart:convert';
import 'dart:io';

main() async {
  var client = new HttpClient();
  var request = await client.getUrl(Uri.parse("http://www.example.com/"));
  var response = await request.close();
  response.transform(utf8.decoder).listen((data) {
    print(data);
  }, onDone: () => response.detachSocket());
  client.close();
}

也不需要拆下插座。


您甚至可以更早调用 client.close,并将 force 参数设置为 false,这是默认值:

main() async {
  var client = new HttpClient();
  var request = await client.getUrl(Uri.parse("http://www.example.com/"));
  client.close();
  var response = await request.close();
  response.transform(utf8.decoder).listen((data) {
    print(data);
  });
}