gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 07:20:18 47 4
gpt4 key购买 nike

使用套接字接收字符串数据。而且似乎传输不完整。服务器发送大约 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/

47 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com