我正在寫Dart中的TCP服務器應用程序。當我用其他語言做類似的事情時,我注意到即使我發送了一個大小爲X的字節緩衝區,我的onData()接收函數也可能會被調用多次,使用加起來爲X的較小緩衝區。如果我不是錯誤,這是因爲流量控制。所以通常我的有效載荷的頭部包含有效載荷大小,我使用它來等待,直到我讀取完整的有效載荷後才處理它。TCP服務器:有效載荷交付是否會發生?
我是否必須在Dart中手動處理?到目前爲止,我沒有遇到問題,並且我已經通過一次調用onData()獲得了整個有效載荷,但我寧願問。
我正在寫Dart中的TCP服務器應用程序。當我用其他語言做類似的事情時,我注意到即使我發送了一個大小爲X的字節緩衝區,我的onData()接收函數也可能會被調用多次,使用加起來爲X的較小緩衝區。如果我不是錯誤,這是因爲流量控制。所以通常我的有效載荷的頭部包含有效載荷大小,我使用它來等待,直到我讀取完整的有效載荷後才處理它。TCP服務器:有效載荷交付是否會發生?
我是否必須在Dart中手動處理?到目前爲止,我沒有遇到問題,並且我已經通過一次調用onData()獲得了整個有效載荷,但我寧願問。
我也沒有問題,但您可以開始處理數據,而響應尚未完全收到。
如果響應很大,所有數據都需要緩衝。這樣你就不能接收比你的可用RAM大的數據。例如下載電影將不可能以這種方式進行。
是的。雖然我不確定傳輸到請求的數據的確切大小,但在訪問通過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();
});
});