2014-04-01 54 views
0

我正在寫Dart中的TCP服務器應用程序。當我用其他語言做類似的事情時,我注意到即使我發送了一個大小爲X的字節緩衝區,我的onData()接收函數也可能會被調用多次,使用加起來爲X的較小緩衝區。如果我不是錯誤,這是因爲流量控制。所以通常我的有效載荷的頭部包含有效載荷大小,我使用它來等待,直到我讀取完整的有效載荷後才處理它。TCP服務器:有效載荷交付是否會發生?

我是否必須在Dart中手動處理?到目前爲止,我沒有遇到問題,並且我已經通過一次調用onData()獲得了整個有效載荷,但我寧願問。

回答

0

我也沒有問題,但您可以開始處理數據,而響應尚未完全收到。
如果響應很大,所有數據都需要緩衝。這樣你就不能接收比你的可用RAM大的數據。例如下載電影將不可能以這種方式進行。

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(); 
    }); 
});