2015-04-01 5 views
0

У меня проблема. Я работаю на простой многопоточный сервер 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 для сравнения с вычисленной контрольной суммой?

Большое спасибо

+2

У вас есть «InputStreamReader». Это * читатель * - вы не читаете * байты * от читателя, вы читаете * текст *. Мне кажется, что вы должны немного переосмыслить свой протокол, чтобы более четко отделить двоичные данные от текстовых данных. Например, обычно имеет заголовок на «сообщение», в котором содержатся некоторые двоичные данные, затем тело ... вы читаете тело как массив байтов, но тогда, если само тело является текстом, вы должны создать (например, через InputStreamReader обертывание ByteArrayInputStream). –

+1

Должен ли TCP не следить за проверками целостности и т. Д.? – Selim

ответ

0

InputStreamReader будет считывать данные на основе символов. Вы должны написать свой собственный InputStream и прочитать x байтов.

Смежные вопросы