簡體   English   中英

DataOutput.writeByte()/ DataInput.readByte()或其他等價物如何在Java中工作?

[英]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.

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