从 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();
这是我的简化代码
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();