使用套接字接收字符串数据。而且似乎传输不完整。服务器发送大约 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 套接字读取的人来说都是一样的——无论语言如何。
另外 - 每当您在同一行看到 await
和 then
时,请保持警惕。它可能可以简化。
关于dart - Flutter Socket.listen() 接收到不完整的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56020084/