我正在通过套接字发送字节数组。发送的数据以 4 个字节开始,指示后续字节数组的长度。
// get the amount of data being sent
byte[] lengthOfReplyAsArray = new byte[4];
forceRead(inputStream, lengthOfReplyAsArray);
int lengthOfReply = byteArrayToInt(lengthOfReplyAsArray);
// read the data into a byte array
byte[] reply = new byte[lengthOfReply];
forceRead(inputStream, reply);
用于从 InputStream 读取数据的方法:
private byte[] forceRead(InputStream inputStream, byte[] result)
throws IOException {
int bytesRead = 0;
int total = result.length;
int remaining = total;
while (remaining > 0)
remaining -= inputStream.read(result, bytesRead, remaining);
return result;
}
用于将字节数组转换为整数的方法:
private int byteArrayToInt(byte[] byteArray) {
int result = 0;
for (int i = 0; (i<byteArray.length) && (i<8); i++) {
result |= (byteArray[3-i] & 0xff) << (i << 3);
}
return result;
}
问题是,数据不是按照到达的顺序读取的。前 4 个字节被读取得很好。其余的都混在一起了。我进行了 TCP 转储以确保数据正确到达客户端。似乎数据被分成 4 个 TCP 数据包。InputStream 返回第一个数据包的前 4 个字节,然后是第四个数据包的全部数据,第二个数据包的最后部分(从“最后一个数据包的长度”开始)和第三个数据包的全部数据。按照这个顺序。
有谁知道可能导致此问题的原因?