gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:47:12 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com