簡體   English   中英

如何加快通過套接字的數據傳輸?

[英]How to speed up data transfer over socket?

目前,我在服務器端和客戶端都使用此代碼。 客戶端是一個android設備。

BufferedOutputStream os = new BufferedOutputStream(socket.getOutputStream(),10000000);
BufferedInputStream sin = new BufferedInputStream(socket.getInputStream(),10000000);
os.write("10000000\n".getBytes());
os.flush();
for (int i =0;i<10000000;i++){
    os.write((sampleRead[i]+" ").getBytes());
    }
os.flush();

問題是此代碼需要大約80秒才能將數據從android客戶端傳輸到服務器,而只需要8秒即可將數據從服務器傳輸回客戶端。 雙方的代碼相同,緩沖區也相同。 我也嘗試過使用不同的緩沖區大小,但是問題出在這一段

for (int i =0;i<10000000;i++){
     os.write((sampleRead[i]+" ").getBytes());
}

在150mbps熱點連接上,緩沖花費了大部分時間,而實際傳輸僅花費了大約6-7秒。 可能是什么問題以及如何解決?

您可以壓縮數據傳輸,這將節省大量內存,並且傳輸壓縮數據流的成本也更低。為此,您需要在客戶端實現壓縮邏輯並在服務器端解壓縮邏輯,請參閱GZIPInputStream。嘗試減小緩沖區大小對於移動設備來說是巨大的...

首先,正如評論員已經指出的那樣,使用巨大的緩沖區可能會適得其反。 一旦流緩沖區大於網絡數據包的大小,應用程序端緩沖就會失去其有效性。 (“大”緩沖區中的數據在進入網絡之前,需要先由TCP / IP堆棧拆分成數據包大小的塊。)確實,如果應用程序端緩沖區很大,您可能會發現數據在網絡實際上處於空閑狀態時,卡在緩沖區中的時間很長,以等待緩沖區填滿...。

Buffered...讀取器,寫入器和流主要是為了避免傳輸大量數據的大量系統調用而設計的。超過10K左右時,緩沖對性能沒有太大幫助。)

現在的另一件事是,在許多操作系統環境中,網絡吞吐量實際上受到虛擬化和默認網絡堆棧調整參數的限制。 為了獲得更好的吞吐量,您可能需要在操作系統級別進行調整。

最后,如果您的網絡路徑通過擁塞的網絡路徑,具有高的端到端延遲或具有受限制的數據速率的鏈接,那么無論您如何調整內容,都不太可能獲得快速的數據傳輸。

(壓縮可能會有所幫助……如果您可以負擔兩端的CPU開銷……但是某些數據鏈接已經透明地進行壓縮了。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM