TCP服务器:有效负载交付是否会发生?

时间:2014-04-01 15:39:54

标签: tcp dart

我在Dart编写TCP服务器应用程序。当我在其他语言中做类似的事情时,我注意到即使我发送一个大小为X的字节缓冲区,我的onData()接收函数也可能被多次调用,并且缓冲区加起来为X.如果我不是错了,这是因为Flow Control。所以通常我的有效载荷的头部包含有效载荷大小,我使用它来等待,直到我在处理它之前读取完整的有效载荷。

我是否必须在Dart中手动处理?到目前为止,我没有遇到过问题,我在一次调用onData()时收到了整个有效负载,但我宁愿问。

2 个答案:

答案 0 :(得分:0)

我也没有问题,但您可以在尚未完全收到回复的同时开始处理数据 如果响应很大,则需要缓冲所有数据。这样您就无法接收大于可用RAM的数据。例如,以这种方式下载电影是不可能的。

答案 1 :(得分:0)

是。虽然我不确定传输到请求的数据的确切大小,但有时您可能需要在访问通过POST或其他方法发送的数据之前完全耗尽流。 (对于http请求的正文)。请参阅Dart教程的Creating a server部分。特别是,您可以在Handling POST requests下查看流的排放方式。通常而不是如示例所示回写片段,它们被直接添加到缓冲区,如下所示:

var buff = [];
req.listen(buff.addAll, 
  onDone: () { 
    print('Received: ${String.fromCharCodes(buff)}'); 
});

查看有关HttpRequest class documentation的更多信息。

作为替代方案,您可以使用http_server package,它将自动为您排空流并根据随请求传递的标头正确处理数据加载。它通过将流转换器应用于传入的HttpRequests流以将它们转换为HttpRequestBody来实现此目的。请参阅下面的示例。有关详细信息,请参阅HttpBodyHandler API

HttpServer.bind(...).then((server) {
  server.transform(new HttpBodyHandler())
    .listen((HttpRequestBody body) {
       // each request is now an HttpRequestBody 
       // which has already drained the stream
       print(body.type);
       print(body.body);
       body.request.response..statusCode = HttpStatus.OK
         ..writeln('Got it!')
         ..close();
    });
 });