TCP服务器:有效负载交付是否会分块进行?

TCP服务器:有效负载交付是否会分块进行?,tcp,dart,Tcp,Dart,我正在Dart中编写一个TCP服务器应用程序。在其他语言中执行类似操作时,我注意到,即使我发送一个大小为X的字节缓冲区,我的onData()receive函数也可能会被调用多次,而较小的缓冲区加起来就是X。如果我没有弄错的话,这是因为流控制。所以通常我的有效负载的头部包含有效负载大小,我使用它来等待,直到我读取了完整的有效负载,然后再处理它 我也必须在Dart中手动处理吗?到目前为止,我还没有遇到任何问题,我已经在对onData()的一次调用中收到了整个有效负载,但我还是想问一下。我也没有问题,

我正在Dart中编写一个TCP服务器应用程序。在其他语言中执行类似操作时,我注意到,即使我发送一个大小为X的字节缓冲区,我的onData()receive函数也可能会被调用多次,而较小的缓冲区加起来就是X。如果我没有弄错的话,这是因为流控制。所以通常我的有效负载的头部包含有效负载大小,我使用它来等待,直到我读取了完整的有效负载,然后再处理它


我也必须在Dart中手动处理吗?到目前为止,我还没有遇到任何问题,我已经在对onData()的一次调用中收到了整个有效负载,但我还是想问一下。

我也没有问题,但您可以在尚未完全收到响应时开始处理数据。

如果响应很大,则需要缓冲所有数据。这样,您就无法接收比可用RAM大的数据。例如,以这种方式下载电影是不可能的。

是的。虽然我不确定传输到请求的数据的确切大小,但有时您必须在访问通过POST或其他方法发送的数据之前完全排空流。(用于http请求的主体)。请参见Dart教程的一节。特别是你可以看到水流是如何在水下排水的。通常情况下,不是如示例所示写回片段,而是将它们直接添加到缓冲区,如下所示:

var buff=[];
请求侦听(buff.addAll,
onDone:(){
打印('Received:${String.fromCharCodes(buff)}');
});
请参阅有关的更多信息

作为替代方案,您可以使用,它将自动为您排出流,并根据随请求传递的标头正确处理数据加载。它通过对传入的HttpRequests流应用流转换器来实现这一点,从而将它们转换为HttpRequestBody。请参见下面的示例。有关更多详细信息,请参阅

HttpServer.bind(…)。然后((服务器){
transform(新的HttpBodyHandler())
.listen((HttpRequestBody){
//每个请求现在都是一个HttpRequestBody
//已经排干了溪水
打印(正文.类型);
打印(body.body);
body.request.response..statusCode=HttpStatus.OK
…writeln('明白了!')
…关闭();
});
});