繁体   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