ByteBuffer "loses"通过 WebSocket 发送时的后备阵列



我所拥有的:客户端通过WebSockets上的ByteBuffer向服务器发送一个双数组。我知道在这一点上,ByteBuffer有一个后备数组。当缓冲器到达服务器时,bytBuffer.hasArray()评估为false

客户端代码:

private void sendData(double[] data) {
    ByteBuffer byteBuffer = ByteBuffer.allocate(data.length * 8);
    System.out.println("hasarray " + byteBuffer.hasArray()); // true
    for (int i = 0; i < data.length; i++) {
        byteBuffer.putDouble(data[i]);
    }
    session.getAsyncRemote().sendBinary(byteBuffer);
}

服务器代码:

@OnMessage
public void onMessage(final ByteBuffer byteBuffer, Session session) {
    byte[] save = new byte[50 * 8];
    System.out.println("server has array " + byteBuffer.hasArray()); // false
    dataService.save(save); // EJB to persist byte[]
    for (Session client : clients) {
        try {
            if(!client.equals(session)){
                client.getBasicRemote().sendBinary(byteBuffer);
            }
        } catch (IOException ex) {
                  Logger.getLogger(TemperatureDispatcher.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

上下文:我基本上有三个独立的应用程序,它们通过WebSockets相互通信。传感器(客户端)生成数据并将其发送到服务器。服务器的工作是将数据发送到另一个客户端(显示数据的JavaFX图表),并将已发送到数据库的数据持久化。

问题:

  1. 当使用ByteBuffer通过WebSockets发送字节时,是否有方法强制使用后备数组
  2. 有没有更好的解决方案可以持久化byte[],而不是将其复制到单独的byte[]

如果ByteBuffer没有后备数组,则它是本机ByteBuffer,您可以使用bb.get(myByteArray);(而不是.array();)从缓冲区中获取字节(假设myByteArray大小是缓冲区中的字节数)。

相关内容

  • 没有找到相关文章

最新更新