gpt4 book ai didi

java - java套接字读取的数据是否与发送时完全相同

转载 作者:行者123 更新时间:2023-12-02 03:01:12 26 4
gpt4 key购买 nike

假设我们在两个设备(A 和 B)之间有一个套接字连接。现在,如果我只向 A 侧套接字的输出流(不是 BufferedOutputStream)写入 16 个字节(大小在这里无关紧要)3 次或通常不止一次,如下所示:

OutputStream outputStream = socket.getOutputStream();
byte[] buffer = new byte[16];
OutputStream.write(buffer);
OutputStream.write(buffer);
OutputStream.write(buffer);

我使用套接字输入流(不是 BufferedInputStream)读取 B 侧的数据,其缓冲区大于发送缓冲区,例如 1024:

InputStream inputStream = socket.getInputStream();
byte[] buffer = new byte[1024];
int read = inputStream.read(buffer);

现在我想知道B端如何接收数据?它可能会累积或准确读取 A 发送的数据吗?换句话说,读取的变量可能会超过16吗?

最佳答案

InputStream对于多字节 read() 的任何调用将读取多少数据几乎没有保证方法。一整类常见的编程错误都与对此的误解和错误假设有关。例如,

  • 如果 InputStream.read(byte[])读取的字节数少于所提供的数组可以容纳的字节数,这并不意味着已到达流的末尾,甚至另一个读取必然会阻塞。
  • 任何一次调用 InputStream.read(byte[]) 读取的字节数不一定与流绘制的字节源的任何特征相关,除了当不在流末尾时它总是会读取至少一个字节,并且它不会读取比流实际可用的字节更多的字节。时间到了。
  • available() 指示的可用字节数方法不能可靠地指示后续读取应该或将读取多少字节。非零返回值可靠地仅指示下一次读取不会阻塞;零返回值告诉您什么都没有

子类可能会对其中一些行为做出保证,但大多数都不会,而且无论如何,您通常不知道您实际上拥有哪个子类。

为了使用InputStream如果正确的话,您通常必须准备好执行重复读取,直到获得足够的数据进行处理。这可能意味着读取直到累积了特定数量的字节,或者读取直到遇到分隔符。在某些情况下,您可以处理任何给定读取中的任意数量的字节;通常,在这些情况下,您无论如何都会循环,并将您读取的所有内容提供给可以接受可变长度 block 的消费者(例如,许多压缩和加密接口(interface)都是这样的)。

关于java - java套接字读取的数据是否与发送时完全相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29922665/

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