Я посылаю байтовые массивы через сокет. Отправленные данные начинаются с 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
Последний фрагмент кода очень полезен. Легко забыть проверить возвращаемое значение. Это простое 2-строчное решение. – user1132959