ソケット経由でバイト配列を送信しています。送信されるデータは、次のバイト配列の長さを示す 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 バイト、次に 4 番目のパケットのデータ全体、2 番目のパケットの最後の部分 (「最後のパケットの長さ」から始まる)、および 3 番目のパケットのデータ全体を返します。この順番で。
この問題の原因を知っている人はいますか?