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

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()不能一次读取整个流?

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

最佳答案



数据不一定全部一口气到达,因为网络通常会将其分解为数据包。 IP是一种分组交换协议(protocol)。



可能,但可能不会。数据包的大小取决于数据遍历的一个或多个网络,但是典型的Internet数据包大小约为1500字节。

如果您一次获得8个字节,则说明您的数据是通过具有异常小的数据包大小的网络发送的,还是(更可能是)发送方一次发送了8个字节的数据。第二种解释或多或少与您的其他评论相吻合。



好吧,不。它未指定以这种方式工作,并且也并非以这种方式工作。您需要根据规范说明编写代码。

这可能与“轮询”设备的方式有关。但是,如果不查看设备的规范(甚至不知道其确切含义),这只是一个猜测。

09-10 10:18
查看更多