我通过套接字发送字节数组。发送的数据以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个字节,然后返回第四个数据包的全部数据,第二个数据包的最后一部分(从“最后一个数据包的长度”开始)和第三个数据包的全部数据。按此顺序。
有没有人有线索可能会导致此问题?
非常感谢。你只是让我的一天(实际上整个下周):) – Francis 2012-04-26 09:45:34
最后一段代码非常有用。忘记检查返回值很容易。这是一个简单的2线解决方案。 – user1132959 2013-05-13 04:50:51