从套接字停止读取52964字节的所有字节

时间:2013-01-10 14:22:42

标签: java c sockets ansi

我正在制作一个获得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);
        }

这是我用来从套接字读取所有字节的代码。 DisInputStream。 当我运行代码1时n出错了。该代码仅接收52964个字节而不是65536个字节。

我还检查了C代码,并说它发送65536个字节。

有人知道我做错了吗?

4 个答案:

答案 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()的情况,而不是自己编码并弄错。