簡體   English   中英

為什么輸入流以塊的形式讀取數據?

[英]Why does input stream read data in chunks?

我試圖使用以下代碼從網絡套接字讀取一些數據 -

Socket s = new Socket(address, 502);
response = new byte[1024];
InputStream is = s.getInputStream();
int count = is.read(response, 0, 100);

數據量不大。 它總共是16個字節。 但是read()語句不能一次讀取所有數據。 它只能將8個字節的數據讀入我的緩沖區。

我必須多次調用read()才能讀取數據 -

Socket s = new Socket(address, 502);
response = new byte[1024];
InputStream is = s.getInputStream();
int count = is.read(response, 0, 100);
count += is.read(response, count, 100-count);

為什么會這樣? 為什么read()不能一次讀取整個流?

請注意,數據不會逐漸到達。 如果我在通過調用Thread.sleep(2000)讀取數據之前等待2秒,則行為保持不變。

為什么read()不能一次讀取整個流?

因為沒有指定這樣做。 見Javadoc。 它會阻塞,直到至少有一個字節可用,然后返回介於1和所提供長度(包括1和1)之間的某個數字。

這反過來是因為數據不一定一次到達。 您無法控制TCP如何發送和接收數據。 您有義務將其視為字節流。

我知道它會阻止數據到達。 “這反過來是因為數據不一定一次到位。” 為什么不是我的問題。

數據不一定全部到達,因為網絡通常將其分解為數據包。 IP是分組交換協議。

TCP是否傳輸8字節的塊?

可能,但可能不是。 數據包大小取決於數據遍歷的網絡/網絡,但典型的Internet數據包大小約為1500字節。

如果您一次獲得8個字節,則您的數據要么通過具有異常小的數據包大小的網絡,要么(更有可能)發送方一次發送8個字節的數據。 第二種解釋或多或少與你的其他評論所說的一致。

既然我明確指定了100,那么一個比緩沖區中的數據大得多的數字不應該嘗試讀取直到至少100個字節?

好吧不。 它沒有指定以這種方式工作,並且它不起作用。 您需要根據規范說明編寫代碼。


這可能與設備被“輪詢”的方式有關。 但是,如果不查看設備的規格(甚至不知道它究竟是什么),這只是猜測。

也許數據逐漸到來不是因為你的閱讀而是因為發件人。

發送方應該使用BufferedOutputStream (在中間)在發送之前制作大塊(並且僅在需要時使用flush)。

暫無
暫無

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

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