![](/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.