簡體   English   中英

Java TCP Socket接收具有指定長度的字節

[英]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);

有沒有更好/有效的方法?

readUTF的JavaDocs

首先, 讀取兩個字節,並以與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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM