我所拥有的:客户端通过 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图表)并将已发送到数据库的数据保存起来。
问题:
- 当使用 ByteBuffer 通过 WebSocket 发送字节时,是否有办法强制使用后备数组?
- 是否有更好的解决方案来保留
byte[]
而不是将其复制到单独的byte[]
?
最佳答案
如果 ByteBuffer
没有后备数组,则它是 native ByteBuffer
,您可以使用 bb.get(myByteArray);
(而不是 .array();
)从缓冲区获取字节(假设 myByteArray
大小是缓冲区中的字节数)。
关于java - 通过 WebSocket 发送时的 ByteBuffer "loses"支持数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34383458/