gpt4 book ai didi

Java InputStream 自动拆分套接字消息

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

我在 Java 中有一个非常奇怪的行为,我不知道这是故意的还是偶然的。

我确实有一个到服务器的套接字连接,它向我发送对请求的响应。我正在使用以下循环从 Socket 读取此响应,该循环封装在 try-with-resource 中。

BufferedInputStream remoteInput = new BufferedInputStream(remoteSocket.getInputStream())
final byte[] response = new byte[512];
int bytes_read;
while ((bytes_read = remoteInput.read(response,0,response.length)) != -1) {
// Messageparsingstuff which does not affect the behaviour
}

根据我的理解,“读取”方法将尽可能多的字节填充到字节数组中。限制因素是接收到的字节数或数组的大小。

不幸的是,这不是正在发生的事情:我正在传输的协议(protocol)用几个较小的答案来回答我的请求,这些答案是通过同一个套接字连接一个接一个地发送的。

在我的例子中,“读取”方法总是返回数组中较小的答案之一。答案的长度各不相同,但适合数组的 512 字节总是足够的。这意味着我的数组始终只包含一条消息,而数组的其余/不需要的部分保持不变。

如果我有意定义比我的消息更小的字节数组,它将返回几个完全填充的数组和最后一个包含其余字节的数组,直到消息完成。

(数组长度为 30 的 100 字节答案返回三个完全填充的数组和一个仅使用 10 个字节的数组)

InputStream 或套接字连接通常不应以任何方式解释传输的字节,这就是我现在非常困惑的原因。我的程序不知道以任何方式使用的协议(protocol)。事实上,我的整个程序只有这个循环和建立套接字连接所需的东西。

如果我可以依靠这种行为,那么解析响应就会变得非常容易,但由于我不知道是什么原因导致了这种行为,所以我不知道我是否可以依靠它。

我传输的协议(protocol)是 LDAP,但由于我的程序完全不知道这一点,所以这无关紧要。

最佳答案

根据我的理解,“读取”方法将尽可能多的字节填充到字节数组中。

你的理解有误。该方法返回“读取的字节数”的全部要点是:它可能返回任何数字。准确地说:当谈到一个阻塞读取时——当该方法返回时,它读取了一些东西;因此它将返回一个 >= 1 的数字。

换句话说:您应该永远每次都依赖read() 读取特定数量的字节。您总是总是总是检查返回的数字;如果您正在等待达到某个值,那么必须在您的代码中对此做一些事情(比如再次缓冲;直到您自己的缓冲区中有“足够”的字节才能继续) .

问题是:在这种读取操作中涉及到一大堆元素。网络、操作系统、jvm。您无法控制到底发生了什么;因此,您不能也不应该像这样在您的代码中构建任何隐含的假设。

关于Java InputStream 自动拆分套接字消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43583511/

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