我所拥有的:客户端通过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通过WebSockets发送字节时,是否有方法强制使用后备数组
- 有没有更好的解决方案可以持久化
byte[]
,而不是将其复制到单独的byte[]
如果ByteBuffer
没有后备数组,则它是本机ByteBuffer
,您可以使用bb.get(myByteArray);
(而不是.array();
)从缓冲区中获取字节(假设myByteArray
大小是缓冲区中的字节数)。