2012-07-23 29 views
2

我想先讀取指定消息大小的4個字節(int),然後根據字節數讀取其餘字節。我使用下面的代碼來實現:Java TCP Socket接收指定長度的字節

DataInputStream dis = new DataInputStream(
         mClientSocket.getInputStream()); 

// read the message length 
int len = dis.readInt(); 

Log.i(TAG, "Reading bytes of length:" + len); 

// read the message data 
byte[] data = new byte[len]; 
if (len > 0) { 
    dis.readFully(data); 
} else { 
    return ""; 
} 
return new String(data); 

是否有這樣做的更好的/有效的方式?

+2

假設您正在使用阻塞I/O,我認爲它非常高效,尤其是如果您必須與非Java代碼交互時。這裏唯一的氣味就是調用一個String類型的構造函數而不指定正確的編碼。 – 2012-07-23 19:25:04

回答

2

從的readUTF的JavaDocs

首先,兩個字節被讀取並用於構建一個無符號16位 * 整數 *與readUnsignedShort方法完全相同。此 整數值稱爲UTF長度並指定 要讀取的附加字節的數量。這些字節然後通過分組考慮將它們轉換爲 個字符。每個組的長度爲 ,根據組的第一個字節的值計算得出。跟在一個組之後的字節 (如果有的話)是下一個組的第一個字節。

唯一的問題是你的協議似乎只發送4個字節的有效載荷長度。也許你可以做一個類似的方法,但是將讀取的長度增加到4字節/ 32位。

此外,我看到你只是在做新的字符串(字節),只要數據的編碼與「平臺的默認字符集」相同,它就可以正常工作。請參閱javadoc因此,確保正確編碼它會更安全(例如,如果您知道發件人將其作爲UTF-8發送,然後執行新的String(字節,「UTF-8」))。

0

如何

DataInputStream dis = new DataInputStream(new BufferedInputStream(
        mClientSocket.getInputStream())); 

return dis.readUTF(); 
+0

感謝您的建議。我需要讀取指定的字節數。不是整個消息。 dis.readUTF()會讀取流中的所有內容嗎? – ssk 2012-07-23 19:16:10

+0

它用'writeUTF()' – 2012-07-23 19:20:48

-1

您可以使用read(byte[] b, int off, int len)這樣

byte[] data = new byte[len]; 
dis.read(data,0,len); 
+0

-1來讀取您寫入的字節數。並獲得緩衝區的部分讀取。 – 2012-07-23 19:22:12