java - 在 Java NIO 中使用 ByteBuffer 读写 Int

标签 java networking nio bytebuffer data-conversion

我想使用 Java NIO API 中的数据报 channel 通过网络传输一个 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 的新手,在调试此类问题时遇到困难。

更新:

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

更新 2:

经过几个小时的努力,问题终于解决了。当您收到缓冲区时,您需要将其倒带。

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

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

最佳答案

每次从写入切换到读取以及从读取切换到写入时,您都会对缓冲区进行 flip() 操作。在 receive()

之后的第二个示例中添加 flip()

完成这项工作后,您应该了解如何重用您的 ByteBuffers 和 EJP 建议的方法。

关于java - 在 Java NIO 中使用 ByteBuffer 读写 Int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13375742/

相关文章:

java - 使用 java 套接字向多个客户端传输大文件的最佳方法

java - 在 Play 框架中使用 Files.createSymbolicLink 获取 FileSystemException "A required privilege is not held by the client"

java - 检测ActiveMQ流控

java - 在Tomcat下开发GWT?

java - 为什么像 Skype 这样的程序不需要您打开端口?

c - 生成数据包

调用 select() 时,Java 线程在向选择器注册 channel 时阻塞。该怎么办?

java - 困惑如何在另一个类中键入比较器

java - 需要有关使用对特定对象的实例方法的引用的基本信息

c++ - 向其他 PC 发送以太网 (UDP) 帧