在 Java NIO 中使用 ByteBuffer 读写 Int

Adi*_*tya 3 java networking nio bytebuffer data-conversion

我想使用 Java NIO API 中的数据报通道通过网络传输一个 int 数组。但是,读/写函数只能将 aByteBuffer作为输入。所以我需要将 int 数据存储到 aByteBuffer然后在接收器处读回。我面对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);
}
Run Code Online (Sandbox Code Playgroud)

这里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;
           }
 }
Run Code Online (Sandbox Code Playgroud)

同样,recvpkt是一个二维数组,它的每一行都会从网络接收一个数据包。

我读到getInt()从中读取 4 个字节ByteBuffer并将当前位置移动 4 个字节。是不是我buffer.flip()以错误的方式使用了。我刚开始使用,NIO并且在如何调试此类问题方面遇到困难。

更新:

错误不再发生。但是现在接收器得到的全部都是零。而我在每个数据包中传输一个二进制序列。当我从发送方本身的缓冲区读回时,所有条目都正确显示,但接收方收到的缓冲区全为零。不知道为什么会这样。

更新 2:

最后,经过数小时的努力,问题得到解决。当您收到缓冲区时,您需要将其倒带。

  channel.receive(buffer);
  buffer.rewind();
Run Code Online (Sandbox Code Playgroud)

如果您现在在缓冲区上使用 getInt 方法,您将能够成功读取缓冲区。

Pet*_*rey 6

每次从写到读和从读到写交换时,你都有一个 flip() 缓冲区。将 flip() 添加到第二个示例之后receive()

一旦你完成了这项工作,你应该看看如何重新使用你的 ByteBuffers 和 EJP 建议。

  • 尽管有(愚蠢的)名字,flip() 并不是它自己的倒数。您必须在写入或获取之前翻转,然后使用 compact() 或 clear()。 (2认同)