dart - Flutter Socket.listen() 接收到不完整的数据

标签 dart flutter

使用套接字接收字符串数据。而且似乎传输不完整。服务器发送大约 80 KB,Flutter 套接字有时接收 1 KB,有时接收大约 10 KB。

尝试了 onDone() 处理程序,它是一样的。在接收到全部数据之前调用它。

我还尝试将数据分成多个部分。我得到了第一个和最后一个数据包,但丢失了两者之间的所有内容。

这是坏了吗?这是我的代码:

Future<String> getNetworkData() async {
  String rawData;
  await Socket.connect(ipAddr, port).then((Socket socket) {
    socket.add(utf8.encode(request));
    socket.listen((var data) {
      rawData = utf8.decode(data);
    });

  return rawData;
}

最佳答案

您传递给 listen 的匿名函数将使用响应 block 多次调用。连接它们取决于。当您需要一个字符串时,您可以使用流 join 便利函数。

Future<String> getNetworkData() async {
  Socket s = await Socket.connect(ipAddr, port);
  s.add(utf8.encode(request));
  String result = await s.transform(utf8.decoder).join();
  await s.close(); // probably need to close the socket
  return result;
}

这假定服务器将在完成发送后关闭套接字。如果你想重用套接字,那么你需要与服务器商定一个方案,以便你知道它何时完成发送。它可以在开始时告诉您长度,或者您可以在数据到达时对其进行解析。这对于任何从 tcp 套接字读取的人来说都是一样的——无论语言如何。

另外 - 每当您在同一行看到 awaitthen 时,请保持警惕。它可能可以简化。

关于dart - Flutter Socket.listen() 接收到不完整的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56020084/

相关文章:

communication - Dart 作为 worker 隔离

flutter - 什么是StatelessWidget?

flutter permission_handler 构建失败

flutter - 如何确保按钮始终固定在向上滑动面板的底部-Flutter

redux - 在 flutter redux 中处理异步事件的最佳方式

flutter - 有没有一种简单的方法可以在 Flutter 测试中找到从 RichText 构建的特定文本?

dart - 按下 flatButton 后如何在 'Text' 小部件中显示文本?

flutter - 提前振颤

json - 如何在Flutter中读取本地JSON导入?

android - 评估根项目 'audioplayers' 时出现问题。无法在 Flutter 项目中应用插件 [id 'kotlin-android']