我有一个socketChannel配置为阻塞,但从这个套接字读取5K字节缓冲区时,我有时会得到一个不完整的缓冲区。Java阻塞套接字返回不完整ByteBuffer
ByteBuffer messageBody = ByteBuffer.allocate(5*1024);
messageBody.mark();
messageBody.order(ByteOrder.BIG_ENDIAN);
int msgByteCount = channel.read(messageBody);
Ocasionally,消息体没有被完全填充和channel.read()不返回-1或者例外,但读取的字节的实际数目(小于5K)。
有没有人遇到过类似的问题?
通过阅读API规范,我希望的是,读不返回,直到字节缓冲区填满(输入不是底层套接字缓冲区传递)。但是,这似乎并非如此。我会说API的实现是有问题的,因为阻塞套接字客户端需要填充缓冲区。 这是如果套接字完全为空并执行读操作会发生的情况。阅读将阻止,直到有东西到达。 无论如何,讨论帮助我解决了这个问题。非常感谢。 – user1069275 2010-04-27 15:13:24
我不能说出你对文档的解释; “至少”对我来说似乎是非常明确的。从实际角度来看,您很少知道套接字将产生多少数据(不像文件),但您希望在数据到达时对其进行处理,如果数据比预期的要少,则不会永远阻止。 – Anon 2010-04-27 15:29:24