java - DataOutput.writeByte()/DataInput.readByte() 或其他等效项在 Java 中如何工作?

标签 java sockets tcp java-io

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/

相关文章:

Java Swing - JLabel 位置

linux - 什么时候发生套接字超时? (Unix)

WCF > 网络服务 : basicHttpBinding vs netTcpBinding

java - 将 PicasawebService 与 GAE 结合使用时出错

java - ActionListeners是如何在内存中设置的?

python - 套接字线程和 PyGTK

Java 通过 TCP 套接字从队列或堆栈发送对象

java - 通过 tcp (Java) 传输文件和附加数据

sockets - 需要帮助澄清 TCP 端口

java - @JsonSerialize 和 @JsonDeserialize 包含在注释中时不起作用