[英]Java TCP Socket receiving bytes with specified length
我試圖先讀取4個byte(int),以指定消息的大小,然后再根據字節數讀取其余字節。 我正在使用以下代碼來完成此任務:
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);
有沒有更好/有效的方法?
首先, 讀取兩個字節,並以與readUnsignedShort方法完全相同的方式構造一個無符號的16位 * 整數 *。 此整數值稱為UTF長度,它指定要讀取的其他字節數 。 然后,通過分組考慮將這些字節轉換為字符。 每個組的長度是根據該組的第一個字節的值計算的。 組之后的字節(如果有)是下一組的第一個字節。
唯一的問題是您的協議似乎僅發送4個字節作為有效載荷長度。 也許您可以執行類似的方法,但是將前哨讀取的長度增加到4字節/ 32位。
另外,我看到您只是在做新的String(bytes),只要數據編碼與“平台的默認字符集”相同,它就可以正常工作。 請參見javadoc。因此,僅確保您正確地對其進行編碼會更安全(例如,如果您知道發送方以UTF-8格式發送它,則改為使用新的String(bytes,“ UTF-8”))。
怎么樣
DataInputStream dis = new DataInputStream(new BufferedInputStream(
mClientSocket.getInputStream()));
return dis.readUTF();
您可以像這樣使用read(byte[] b, int off, int len)
byte[] data = new byte[len];
dis.read(data,0,len);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.