java - 通过 WebSocket 发送时的 ByteBuffer "loses"支持数组

标签 java 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 通过 WebSocket 发送字节时,是否有办法强制使用后备数组?
  2. 是否有更好的解决方案来保留 byte[] 而不是将其复制到单独的 byte[]

最佳答案

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

关于java - 通过 WebSocket 发送时的 ByteBuffer "loses"支持数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34383458/

相关文章:

java - eclipse中跳过所有断点的快捷键

javascript - Python Tornado : how do I set WebSocket headers?

javascript - 使用 Websocket 连接到虚拟机

java - 类型不匹配 : convert from String to List<String>

c++ - 如何使用websocket websocketpp发送和接收消息?

java - JSR-356 : How to abort a websocket connection during the handshake?

Java Atmosphere Jersey 从 Broadcastable 返回 JSON 对象

java - 如何在托管 Bean (JSF) 中 @Autowire BeanFactory

java - Apache POI 注释 Excel

java - 如何在 Java 中将 Unchecked Exception 转换为 Checked Exception,反之亦然