【发布时间】:2017-04-24 08:45:41
【问题描述】:
我在 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
}
根据我的理解,“读取”方法将尽可能多的字节填充到字节数组中。限制因素是接收的字节数或数组的大小。
不幸的是,这不是发生的事情:我正在传输的协议用几个较小的答案来回答我的请求,这些答案通过同一个套接字连接一个接一个地发送。
在我的情况下,“读取”方法总是返回数组中那些较小的答案之一。答案的长度各不相同,但适合数组的 512 字节总是足够的。这意味着我的数组始终只包含一条消息,并且数组的其余/不需要的部分保持不变。
如果我故意将字节数组定义为小于我的消息,它将返回几个完全填充的数组和一个包含其余字节的最后一个数组,直到消息完成。
(数组长度为 30 的 100 字节答案返回三个完全填充的数组和一个仅使用 10 个字节的数组)
InputStream 或套接字连接通常不应该以任何方式解释传输的字节,这就是我现在很困惑的原因。我的程序以任何方式都不知道使用的协议。其实我整个程序就是这个循环和建立socket连接需要的东西。
如果我可以依赖这种行为,它会使解析响应变得非常容易,但由于我不知道首先是什么导致了这种行为,所以我不知道我是否可以指望它。
我正在传输的协议是 LDAP,但由于我的程序完全不知道这一点,所以这不重要。
【问题讨论】:
-
我喜欢 Tmesus 这个词,它是英语中唯一以 tm.... 开头的词 ;)
-
我什至不知道这个词。有趣,你可以在这里学到什么。
-
我什至不知道这个词。我使用了“tmesis”这个词,并在其中添加了拉丁男性单数后缀。
-
@GhostCat 你有什么特别的原因让你删掉我最后一句以及我在帖子中的“签名”吗?我没有生气或任何事情。只是好奇这是否是我应该首先避免的事情。
-
也许我应该在这样做的时候告诉你。事情是:“聊天”是给cmets的。或者换句话说:问题或答案中没有“称呼”(例如参见here)。换句话说:这不是什么大事,但你知道,我们在那里是非常认真的人,我们甚至彼此都不是很好……为了记录:这不完全是我喜欢的政策;但好吧,这是非正式的事情。