从 java 套接字 (TCP) 读取 19000 字节

read 19000 bytes from java socket(TCP)

这是我的简化代码

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。这基本上是相同的位置,但有点不同。

知道我做错了什么吗?

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

"Reads some number of bytes from the input stream and stores them into the buffer array b. The number of bytes actually read is returned as an integer."

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

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

ByteArrayOutputStream b= new ByteArrayOutputStream();

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

byte data[] = b.toByteArray();