1
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 操作系统将在机器 1 执行writeByte命令/语句后立即缓冲来自机器 1 的消息,因此机器 2 将向机器 1 发出信号以继续执行第 1 行?

readByte或者如果 Java 应用程序在应用程序级别执行命令/语句,机器 2 只会向机器 1 发出信号以继续?

如果整个接收过程发生在操作系统级别,我们如何控制用于缓存传入数据的缓冲区大小(在机器 2 中)?

4

3 回答 3

1

如果您希望发送者等待接收者,则接收者必须向发送者发送回一些东西。通常这不是您应该担心的事情,因为 TCP 会处理一端和另一端之间的所有握手。

但是在什么时候,我可以说机器 2 已经读取了数据并且第 1 行之后的代码将执行?

当机器 #2 发送机器说它已读取来自 #1 的消息时

它发生在操作系统级别还是应用程序级别?

在应用程序级别,因为大多数应用程序不需要此保证。

例如,机器 2 操作系统将在机器 1 执行 writeByte 命令/语句后立即缓冲来自机器 1 的消息,因此机器 2 将向机器 1 发出信号以继续执行第 1 行?

机器#1 一直等到一个副本被放置在它的缓冲区中。它不会等待将其放入#2 机器缓冲区或被读取。

或者如果 Java 应用程序在应用程序级别执行 readByte 命令/语句,机器 2 只会向机器 1 发出信号以继续?

除非您添加它,否则不存在此类信号。

如果整个接收过程发生在操作系统级别,我们如何控制用于缓存传入数据的缓冲区大小(在机器 2 中)?

您可以通过将其设置为您想要的大小来控制它。大多数时候你不需要改变它,你不需要比这更多的控制。

您必须清楚地了解您要解决的实际程序,而不是想象的程序,并且您可能会发现 TCP 已经处理了您需要的程序。

于 2013-07-11T04:13:54.487 回答
1

根据 TCP,如果机器 2 尚未成功读取从上面发送的数据,我可以说第 1 行之后的代码不会执行吗?

不会。除非您和对等方之间的所有中间缓冲区都已满,否则代码将继续运行。

但是在什么时候,我可以说机器 2 已经读取了数据并且第 1 行之后的代码将执行?

你不能,用这个代码。如果您需要知道对等方已读取数据,则必须向您发送一条消息,说明这一点。

它发生在操作系统级别还是应用程序级别?

'它'是什么?

例如,机器 2 操作系统将在机器 1 执行 writeByte 命令/语句后立即缓冲来自机器 1 的消息,因此机器 2 将向机器 1 发出信号以继续执行第 1 行?

不会。writeByte()除非发送缓冲区已满,否则会将字节放入本地内核的 TCP 发送缓冲区,您的应用程序将继续运行。同时,当您的应用程序继续运行时,TCP 会将其发送缓冲区的内容发送给对等方。

或者如果 Java 应用程序在应用程序级别执行 readByte 命令/语句,机器 2 只会向机器 1 发出信号以继续?

不,机器 2 根本没有“发出信号机器 1 继续”。

如果整个接收过程发生在操作系统级别,我们如何控制用于缓存传入数据的缓冲区大小(在机器 2 中)?

Socket.setReceiveBufferSize()。

于 2013-07-11T05:19:02.053 回答
1

TCP 通常有本地缓冲区。Java 不处理由操作系统处理的通信。Java 访问本地缓冲区,读取将清空缓冲区中的字节,写入会将字节放入缓冲区。

如果您尝试从空缓冲区读取或写入满缓冲区,则阻塞 IO 的行为是阻塞。

收到数据块后,客户端将向发送者发送确认。发送方将在收到 ack 时从其缓冲区中清空该数据。

请记住,路由上的各种路由器和交换机可能有自己的缓冲区,并且发送方可能会在客户端接收任何数据之前收到确认。

可以使用 setReceiveBufferSize 和 setSendBufferSize 方法设置缓冲区大小。

http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html

于 2013-07-11T03:01:20.970 回答