我在Dart编写TCP服务器应用程序。当我在其他语言中做类似的事情时,我注意到即使我发送一个大小为X的字节缓冲区,我的onData()接收函数也可能被多次调用,并且缓冲区加起来为X.如果我不是错了,这是因为Flow Control。所以通常我的有效载荷的头部包含有效载荷大小,我使用它来等待,直到我在处理它之前读取完整的有效载荷。
我是否必须在Dart中手动处理?到目前为止,我没有遇到过问题,我在一次调用onData()时收到了整个有效负载,但我宁愿问。
答案 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();
});
});