【问题标题】:Read all bytes from socket Stops at 52964 bytes从套接字读取所有字节在 52964 字节处停止
【发布时间】:2013-01-10 14:22:41
【问题描述】:

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

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

有人知道我做错了吗?

【问题讨论】:

  • 你有发送方代码吗?
  • 我不明白这是怎么发生的,因为我认为你没有得到 -1 的 EOF。你得到了什么,一个例外?
  • 你设置了socket的接收缓冲区大小吗?
  • 不是主要问题,但您的循环跳过了最后一个字节,请使用while(pos &lt; length)

标签: java c sockets ansi


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      另外,最好在假设 I/O 成功之前单独保存 I/O 调用的返回值并检查它。如果那是@987654321@,则在出错时返回 -1。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-09-24
          • 1970-01-01
          • 1970-01-01
          • 2020-10-20
          • 1970-01-01
          • 2013-02-13
          • 2015-09-01
          相关资源
          最近更新 更多