簡體   English   中英

套接字和DataInputStream

[英]Sockets and DataInputStream

我試圖理解這段代碼

        DataInputStream stream = 
          new DataInputStream(
            new ByteArrayInputStream(messageBuffer));


        int     messageLength   = stream.readInt();
        char    recordType      = (char) stream.readByte();
        byte    padding         = stream.readByte();
        short   numberRecords   = stream.readShort();

messageBuffer初始化為新字節[32768],通過Socket.read()方法填充。 我不明白的是,一旦messageLength初始化為stream.readInt(),第二個第二個語句將如何工作,即recordType?

第一個語句不會從字節數組的開頭讀取一個int而下一個語句從字節數組的開頭讀取一個字節嗎? 究竟是如何知道從哪個點讀取字節,整數,短路等?

文檔

ByteArrayInputStream包含一個內部緩沖區,其中包含可從流中讀取的字節。 內部計數器跟蹤read方法提供的下一個字節。

換句話說, DataInputStream只是從ByteArrayInputStream讀取,而后者則記住字節數組中的當前位置,並在每次讀取一些數據時將其前進。

DataInputStream.read*方法使用基礎輸入流中的字節。 在這種情況下, read*方法讀取ByteArrayInputStream提供的下一個可用字節,它將跟蹤數組中的當前位置。


作為旁注,您可能需要考慮使用ByteBuffer.wrap和各種ByteBuffer.read方法:

ByteBuffer msgBuf = ByteBuffer.wrap(messageBuffer);
int messageLength = msgBuf.getInt();
char recordType   = msgBuf.getChar();
...

readX()不從流的開頭讀取。 事實上,術語用於表示隨時間推移可用的數據序列。 這意味着從流中的后續讀取將檢索不同的元素。

將流視為信息的傳送帶而不是陣列。

Socket.read()將讀取可用的字節。 最小值是一個字節! 最大值是緩沖區大小,其中可以包含任意數量的消息。

而不是手動讀取緩沖區,使用DataInputStream / BufferedInputStream更安全,更簡單,更高效。

// create an input stream once per socket.
DataInputStream stream = 
      new DataInputStream(
        new BufferedInputStream(socket.getInputStream()));


int     messageLength   = stream.readInt();
char    recordType      = (char) stream.readByte();
byte    padding         = stream.readByte();
short   numberRecords   = stream.readShort();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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