![](/img/trans.png)
[英]How to write and read the byte array to DataInput and DataOutput Stream
[英]How DataOutput.writeByte()/DataInput.readByte() or other equivalent works in Java?
byte[] message = ...
Socket socket = ...
DataOutputStream dOut = new DataOutputStream(socket.getOutputStream());
dOut.write(message); //#1
... //other code
讓我們假設機器1(帶有上面的代碼)試圖將某些東西發送到試圖從機器1讀取字節的機器2。
根據TCP,如果機器2還沒有成功讀取從上面發送的數據,我可以說第1行之后的代碼不會執行嗎?
但是在什么時候,我可以說機器2已經讀取了數據並且第1行之后的代碼會執行? 它發生在操作系統級別或應用程序級別? 例如,機器2 OS將在機器1執行writeByte
命令/語句后立即緩沖來自機器1的消息,因此機器2將向機器1發出信號以繼續執行第1行?
或者,如果Java應用程序在應用程序級別執行readByte
命令/語句,機器2將僅向機器1發出信號?
如果整個接收過程發生在操作系統級別,我們如何控制用於緩存傳入數據的緩沖區大小(在機器2中)?
TCP通常具有本地緩沖區。 Java不處理由OS處理的通信。 Java訪問本地緩沖區,讀取將從緩沖區中清空字節,寫入將字節放入緩沖區。
如果您嘗試從空緩沖區讀取或寫入完整緩沖區,則阻止IO會阻塞。
收到數據塊后,客戶端將向發件人發送確認。 發送方將在收到確認時從其緩沖區清空該數據。
請記住,沿路線的各種路由器和交換機可能有自己的緩沖區,發送方可能會在客戶端接收任何數據之前收到確認。
可以使用setReceiveBufferSize和setSendBufferSize方法設置緩沖區大小。
http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html
如果您希望發送方等待接收方,則接收方必須向發送方發回一些內容。 通常這不是你應該擔心的事情,因為TCP處理一端和另一端之間的所有握手。
但是在什么時候,我可以說機器2已經讀取了數據並且第1行之后的代碼會執行?
機器#2發送機器說它已從#1讀取消息
它發生在操作系統級別或應用程序級別?
在應用程序級別,因為大多數應用程序不需要此保證。
例如,機器2 OS將在機器1執行writeByte命令/語句后立即緩沖來自機器1的消息,因此機器2將向機器1發出信號以繼續執行第1行?
機器#1等待,直到將副本放入其緩沖區。 它不等待將它放入#2機器緩沖區或者它被讀取。
或者,如果Java應用程序在應用程序級別執行readByte命令/語句,機器2將僅向機器1發出信號?
除非您添加它,否則不存在此類信號。
如果整個接收過程發生在操作系統級別,我們如何控制用於緩存傳入數據的緩沖區大小(在機器2中)?
您可以通過將其設置為所需的大小來控制它。 您不需要在大多數時間更改此設置,並且您不需要比此更多的控件。
你必須清楚地知道你想要解決的真實的,而不是想象的程序,你可能會發現TCP已經處理了你需要的東西。
根據TCP,如果機器2還沒有成功讀取從上面發送的數據,我可以說第1行之后的代碼不會執行嗎?
不會。除非您和對等方之間的所有中間緩沖區已滿,否則代碼將繼續。
但是在什么時候,我可以說機器2已經讀取了數據並且第1行之后的代碼會執行?
你不能,用這個代碼。 如果您需要知道對等方已經讀取了數據,則必須向您發送一條消息。
它發生在操作系統級別或應用程序級別?
'它是什么?
例如,機器2 OS將在機器1執行writeByte命令/語句后立即緩沖來自機器1的消息,因此機器2將向機器1發出信號以繼續執行第1行?
不會。只有發送緩沖區已滿, writeByte()
會將字節放入本地內核的TCP發送緩沖區,您的應用程序將繼續運行。 同時,在您的應用程序繼續運行時,TCP會將其發送緩沖區的內容發送給對等方。
或者,如果Java應用程序在應用程序級別執行readByte命令/語句,機器2將僅向機器1發出信號?
機器2根本沒有“讓機器1信號繼續”。
如果整個接收過程發生在操作系統級別,我們如何控制用於緩存傳入數據的緩沖區大小(在機器2中)?
socket的()。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.