我正在制作一个获得64 kb大小的软件包的服务器。
int length = 65536;
byte[] bytes = new byte[length];
int pos = 0;
while(pos < length -1)
{
System.out.println("Before read");
pos += dis.read(bytes, pos, length-pos);
System.out.println(""+pos+" >> "+ length);
}
这是我用来从套接字读取所有字节的代码。 Dis
是InputStream
。
当我运行代码1时n出错了。该代码仅接收52964个字节而不是65536
个字节。
我还检查了C代码,并说它发送65536
个字节。
有人知道我做错了吗?
答案 0 :(得分:2)
这是另一种情况,Jakarta Commons IOUtils比自己写一个更好的选择。它是一行代码,经过全面测试。在这种情况下,我建议IOUtils.readFully()
。
如果它没有读取整个缓冲区,那么您就知道您没有发送所有内容。也许你错过了服务器端的同花顺。
答案 1 :(得分:1)
InputStream.read()
返回读取的字节数,如果已到达流的末尾,则返回-1。您需要检查该错误情况。另外,我怀疑你的while(..)
循环是个问题。你为什么称它为pos
?你可能会过早地终止。此外,确保您的C代码正常发送,无论它在做什么。您可以使用Wireshark等工具检查网络流量。
答案 2 :(得分:0)
你的意思是“出错了”?什么是输出?它在读取完整的64 KB之前无法退出循环,那么究竟发生了什么?
另外,在假设I / O成功之前,最好分别保存I / O调用的返回值并检查它。如果是DataInputStream.read()
,则在出错时返回-1。
答案 3 :(得分:0)
您的代码不正确,因为它没有检查-1。
这是使用DataInputStream.readFully()的情况,而不是自己编码并弄错。