簡體   English   中英

在 Java NIO 中使用 ByteBuffer 讀寫 Int

[英]Read and Write Int using ByteBuffer in Java NIO

我想使用 Java NIO API 中的數據報通道通過網絡傳輸一個 int 數組。 但是,讀/寫函數只能將ByteBuffer作為輸入。 因此,我需要將 int 數據存儲到ByteBuffer ,然后在接收器處將其讀回。 我正面臨java.nio.BufferUnderflowException 這是我在發送方所做的:

for(i = 0; i < send_data.length; i++)
{
          //Write the data onto Buffer
          ByteBuffer buffer1 = ByteBuffer.allocate(send_data[i].length*4);
          for(j = 0; j < send_data[i].length; j++)
                     buffer1.putInt(send_data[i][j]);
          buffer1.flip();
          //Transmit the data
          while(buffer1.hasRemaining())
                 channel.write(buffer1);
}

這里, send_data是一個二維數組,其中每一行都被視為一個單獨的數據包。

在接收端

for(i = 0; i < k; i++)
{
           ByteBuffer buffer = ByteBuffer.allocate((recvpkt[0].length)*4);
           channel.receive(buffer);
           j = 0;
           while(buffer.hasRemaining())
           {
                  recvpkt[i][j] = buffer.getInt();
                  j = j+1;
           }
 }

同樣, recvpkt是一個二維數組,它的每一行都會從網絡接收一個數據包。

我讀到getInt()ByteBuffer讀取 4 個字節並將當前位置移動 4 個字節。 是不是我以錯誤的方式使用了buffer.flip() 我是使用NIO新手,並且在如何調試此類問題方面遇到困難。

更新:

錯誤不再發生。 但是現在接收器得到的全部都是零。 而我在每個數據包中傳輸一個二進制序列。 當我從發送方本身的緩沖區讀回時,所有條目都正確顯示,但接收方收到的緩沖區全為零。 不知道為什么會這樣。

更新 2:

最后,經過數小時的努力,問題得到解決。 當您收到緩沖區時,您需要將其倒帶。

  channel.receive(buffer);
  buffer.rewind();

如果您現在在緩沖區上使用 getInt 方法,您將能夠成功讀取緩沖區。

每次從寫到讀和從讀到寫交換時,你都有一個 flip() 緩沖區。 receive()之后的第二個例子中添加flip receive()

一旦你完成了這項工作,你應該看看如何重新使用你的 ByteBuffers 和 EJP 建議。

暫無
暫無

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

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