2015-04-01 114 views
0

我遇到問題。我工作在一個簡單的Java多線程TCP服務器上,而我現在有這樣的問題:從InputStreamReader讀取4個字節

客戶端可以給我一個輸入字符串,如

[符]文本\ r \ n

這是好的,我已經完成了。每個輸入查詢都需要以\ r \ n結束,但一種情況除外。

這種情況是當客戶端發送圖像作爲二進制數據。此消息具有以下結構:

PHOTO [空間] [數據的長度] [空間] [數據] [4個字節在大端校驗]

和整點是要麼返回

202 OKAY \ r \ n時校驗比特的數據的總和相匹配

消息,或者...

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返回()是錯誤的,因爲結果是關閉的一個通斷量。我導致認爲使用ByteBuffer是正確的,我只是不知道如何用正確的值填充字節數組。

我也試圖在InputSreamReader轉換成字節數組,但我發現它不是去一個有效的方式,因爲一個消息......

PHOTO [空格] [數據長度] [空間] [data] [4字節的BIG ENDIAN中的校驗和] [IDENTIFIER]文本\ r \ n

...有效,需要解釋爲2條消息。

我做了一些測試,發現我成功設法讀取所有數據並計算有效校驗和,因此輸入中接下來的4個字節是校驗和的4個字節,我還沒有設法讀取它。

而且,這裏的帶照片的有效消息的例子

PHOTO 8 ABCDEFGH \ X00 \ X00 \ X02 \ X24

所以我想請問,我該如何閱讀這些4個字節並將它們轉換爲int以與計算校驗和進行比較?

非常感謝

+2

你有一個'InputStreamReader'。這是一個*閱讀器* - 您不讀取*閱讀器的*字節*,您閱讀*文本*。這聽起來像你應該重新考慮一下你的協議,以更清楚地分離二進制數據和文本數據。例如,通常每個包含一些二進制數據的「消息」包含一個頭,然後是一個主體......您將該主體作爲字節數組讀取,但如果主體本身是文本,則會構建一個閱讀器(例如通過包裝ByteArrayInputStream的InputStreamReader)。 – 2015-04-01 17:12:43

+1

TCP不應該照顧完整性檢查等嗎? – Selim 2015-04-01 17:17:10

回答

0

InputStreamReader將讀取基於字符的數據。您必須編寫自定義InputStream並從中讀取x個字節。