【问题标题】:read 19000 bytes from java socket(TCP)从 Java 套接字(TCP)读取 19000 个字节
【发布时间】:2015-04-22 20:31:46
【问题描述】:

这是我的简化代码

sock.getOutputStream().write(buff); //send a readRequest
byte[] rbuff = new byte[19210]; //Answer has 19210 bytes of data
sock.getInputStream().read(rbuff);

在wireshark 中,我看到它被分成几个tcp 包。 但是读取不应该等待19210字节到达吗?

我得到了数据,但从某个位置开始,所有字节都是 0。这几乎是相同的位置,但略有不同。

知道我在这里做错了什么吗?

【问题讨论】:

  • 最大数据包大小由本地网络的MTU的值定义。通常这大约是 1500 字节。

标签: java sockets tcp


【解决方案1】:

您可以尝试像这样分块阅读它:

ByteArrayOutputStream b= new ByteArrayOutputStream();

byte[] buf = new byte[1024];
while (count = in.read(buf)) > 0)
{
  b.write(buf,0,n);
}

byte data[] = b.toByteArray();

【讨论】:

  • @EJP:- 是的,这是一个更好的!
【解决方案2】:

简单研究Inputstream.read()的Javadoc:

“从输入流中读取一定数量的字节并将它们存储到缓冲区数组b中。实际读取的字节数以整数形式返回。”

含义:read() 不会等到它有足够的字节来填充缓冲区。当它可以填充 一些 字节时,它已经很高兴了。因此,您必须检查返回的数字;并循环直到你收集到你需要的所有字节。换句话说:不要提供大小为 19K 的缓冲区;使用较小的;并将收到的字节“复制”到另一个数据结构中。

【讨论】:

  • 旁注:你应该很高兴早点想到这一点。我记得,15 年前,当我为我的第一份工作编写我的第一个“巨大”Java 应用程序时,它一直在我们的表中显示奇怪的条目......持续了 3、4 个月;比如一周一次左右。费了很大功夫……才发现我的代码没有检查 read 返回的数字;所以在极少数情况下,它只会读取 3 个字节,而不是 5 个;然后所有后续步骤“成功”处理不完整的数据;-)
猜你喜欢
  • 2019-04-02
  • 2019-09-13
  • 2016-09-24
  • 2016-08-10
  • 2020-10-20
  • 2013-10-12
  • 2016-05-04
  • 2015-09-01
  • 2022-01-25
相关资源
最近更新 更多