byte[] message = ...
Socket socket = ...
DataOutputStream dOut = new DataOutputStream(socket.getOutputStream());
dOut.write(message); //#1
... //other code
让我们假设机器 1(使用上面的代码)试图向机器 2 发送一些东西,而机器 2 正试图从机器 1 读取字节。
根据TCP,我可以说如果机器2还没有成功读取上面发送的数据,第一行之后的代码就不会执行吗?
但是在什么时候,我可以说机器 2 已经读取了数据并且第 1 行之后的代码将执行?它发生在操作系统级别还是应用程序级别?例如,机器 2 操作系统将在机器 1 执行 writeByte
命令/语句后立即缓冲来自机器 1 的消息,因此机器 2 将向机器 1 发出信号以继续第 1 行?
或者如果 Java 应用程序在应用程序级别执行 readByte
命令/语句,机器 2 只会向机器 1 发出信号?
如果整个接收过程发生在操作系统级别,我们如何控制用于缓存传入数据的缓冲区大小(在机器 2 中)?
最佳答案
TCP 通常有本地缓冲区。 Java 不处理由操作系统处理的通信。 Java 访问本地缓冲区,读取将从缓冲区中清空字节,而写入会将字节放入缓冲区。
如果您尝试从空缓冲区读取或写入已满缓冲区,则阻塞 IO 的行为是阻塞。
收到数据 block 后,客户端将向发送方发送确认。发送方将在收到确认后从其缓冲区中清空该数据。
请记住,沿途的各种路由器和交换机可能有自己的缓冲区和 发送方可能会在客户端接收任何数据之前收到确认。
可以使用 setReceiveBufferSize 和 setSendBufferSize 方法设置缓冲区大小。
http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html
关于java - DataOutput.writeByte()/DataInput.readByte() 或其他等效项在 Java 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17584032/