我遇到問題。我工作在一個簡單的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以與計算校驗和進行比較?
非常感謝
你有一個'InputStreamReader'。這是一個*閱讀器* - 您不讀取*閱讀器的*字節*,您閱讀*文本*。這聽起來像你應該重新考慮一下你的協議,以更清楚地分離二進制數據和文本數據。例如,通常每個包含一些二進制數據的「消息」包含一個頭,然後是一個主體......您將該主體作爲字節數組讀取,但如果主體本身是文本,則會構建一個閱讀器(例如通過包裝ByteArrayInputStream的InputStreamReader)。 – 2015-04-01 17:12:43
TCP不應該照顧完整性檢查等嗎? – Selim 2015-04-01 17:17:10