java - 为什么输入流以 block 的形式读取数据?

标签 java sockets network-programming inputstream

我正在尝试使用以下代码从网络套接字读取一些数据 -

Socket s = new Socket(address, 502);
response = new byte[1024];
InputStream is = s.getInputStream();
int count = is.read(response, 0, 100);

数据量不大。总共16个字节。然而 read() 语句并不能一次性读取所有数据。它只将 8 个字节的数据读入我的缓冲区。

我必须像这样多次调用 read() 才能读取数据 -

Socket s = new Socket(address, 502);
response = new byte[1024];
InputStream is = s.getInputStream();
int count = is.read(response, 0, 100);
count += is.read(response, count, 100-count);

为什么会发生这种情况?为什么 read() 不能一次性读取整个流?

请注意,数据并不是逐渐到达的。如果我在通过调用 Thread.sleep(2000) 读取数据之前等待 2 秒,则行为保持不变。

最佳答案

Why does read() not read the entire stream in one go?

因为没有指定这样做。请参阅 Javadoc。它会阻塞,直到至少有一个字节可用,然后返回 1 和提供的长度(含)之间的某个数字。

这是因为数据不一定一次性到达。您无法控制 TCP 如何发送和接收数据。您必须将其视为字节流。

关于java - 为什么输入流以 block 的形式读取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12090018/

相关文章:

networking - Golang DNS 解析不起作用

java - 在本地运行,但不在服务器上运行,因为 "Data source name not found and no default driver specified"

java - 当第三方客户端调用我的网络服务时调用 Controller

java - 如何使用 java jnr 推断 clib 结构

xcode - 使用 TCP/IP 发送数据包以在 XCode 中使用

java - 结合Java + 蓝牙 + arduino

java - 处理所有异常

C++ Socket recv 未接收到正确的字节数?

ruby - 网络聊天程序!! (需要一点帮助)

sockets - Kubernetes TCP Probe 如何处理 TCP 握手由操作系统管理的事实?