У меня проблема. Я работаю на простой многопоточный сервер TCP в Java, и я в настоящее время эта проблема:Чтение 4 байта из InputStreamReader
Клиент может послать мне входную строку, например,
[IDENTIFIER] текст \ г \ п
Это нормально, и я сделал это. Каждый входной запрос должен заканчиваться на \ r \ n, за исключением одного случая.
Этот случай, когда клиент отправляет изображение в виде двоичных данных. Это сообщение имеет следующую структуру:
PHOTO [пробел] [длину данных] [пробел] [Данные] [4 байта контрольной суммы в BIG Endian]
и всей точки либо возвращать
202 ХОРОШО \ г \ п
сообщение, когда контрольная сумма соответствует сумме битов в данных, или ...
302 в AD CHECKSUM \ r \ n
... в противном случае. Тем не менее, у меня возникают серьезные проблемы с чтением 4 байтов. источника входного сигнала является экземпляром InputStreamReader, полученным из:
in = new InputStreamReader(this.clientSocket.getInputStream());
и функция InputStreamReader.read() возвращают Int из полукокса, который был только для чтения. Теперь, я попытался
correctChecksumBytes = new byte[4];
for(int i = 0 ; i < 4 ; ++i) {
correctChecksumBytes[i] = (byte) in.read();
}
if (correctChecksumBytes == null) {
throw new BadSyntax();
}
bb = ByteBuffer.wrap(correctChecksumBytes);
bb.order(ByteOrder.BIG_ENDIAN);
fourByteCheck = bb.getInt();
Однако, теперь я понимаю, что отливку Int вернулся из in.read() является неправильным, так как результат выключены на сумму Hige. Я был убежден, что использование ByteBuffer верное, я просто не знаю, как заполнить массив байтов правильными значениями.
Я также попытался преобразовать InputSreamReader в массив байтов, но я обнаружил, что это не является правильным способом пойти, так как сообщение ...
ФОТО [пробел] [длина данных] [пробел ] [данные] [4 байта контрольной суммы в BIG ENDIAN] [IDENTIFIER] text \ r \ n
... действителен и должен толковаться как 2 сообщения.
Я провел несколько тестов и обнаружил, что мне удалось прочитать все данные и вычислить действительную контрольную сумму, поэтому следующие 4 байта ввода - это 4 байта контрольной суммы, которые мне пока не удалось прочитать.
Кроме того, здесь приведен пример допустимого сообщения ФОТО
ФОТО 8 ABCDEFGH \ x00 \ x00 \ x02 \ x24
Так что я хотел бы спросить, как я могу читать эти 4 байта и преобразовать их в int для сравнения с вычисленной контрольной суммой?
Большое спасибо
У вас есть «InputStreamReader». Это * читатель * - вы не читаете * байты * от читателя, вы читаете * текст *. Мне кажется, что вы должны немного переосмыслить свой протокол, чтобы более четко отделить двоичные данные от текстовых данных. Например, обычно имеет заголовок на «сообщение», в котором содержатся некоторые двоичные данные, затем тело ... вы читаете тело как массив байтов, но тогда, если само тело является текстом, вы должны создать (например, через InputStreamReader обертывание ByteArrayInputStream). –
Должен ли TCP не следить за проверками целостности и т. Д.? – Selim