4

我正在制作一个获取 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。当我运行 n 中的代码 1 时出错。该代码仅接收 52964 字节而不是65536字节。

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

有人知道我做错了什么吗?

4

4 回答 4

2

这是另一个案例,Jakarta Commons IOUtils是比自己编写更好的选择。这是一行代码,并且已经过全面测试。我建议IOUtils.readFully()在这种情况下。

如果它没有读取整个缓冲区,那么您就知道您没有发送所有内容。也许您错过了服务器端的刷新。

于 2013-01-10T14:29:26.730 回答
1

InputStream.read()返回读取的字节数,如果已到达流的末尾,则返回 -1。您需要检查该错误情况。另外,我怀疑你的while(..)循环是问题所在。你为什么称它为pos在位?您可能会提前终止。此外,请确保您的 C 代码,无论它在做什么,都能正确发送。您可以使用Wireshark之类的工具检查网络流量以确保确定。

于 2013-01-10T14:28:58.227 回答
0

你是什​​么意思它“出错”?输出是什么?在读取完整的 64 KB 之前它不能退出循环,那么到底会发生什么?

此外,最好在假设 I/O 成功之前单独保存 I/O 调用的返回值并检查它。如果是DataInputStream.read(),则在出错时返回 -1。

于 2013-01-10T14:26:17.237 回答
0

您的代码不正确,因为它不检查 -1。

这是使用 DataInputStream.readFully() 而不是自己编码并弄错的情况。

于 2013-01-10T20:56:23.043 回答