(必要吗?)ByteBuffer.wrap(buffer.array())的副作用

时间:2014-11-30 04:45:14

标签: java websocket bytebuffer

这里的背景是我使用jetty websocket服务器连接到客户端上的javascript。服务器具有套接字端点,您可以通过它发送ByteBuffer

奇怪的是,如果我构建一个数组bytes[]并发送ByteBuffer.wrap(byteArray),它就可以了。

如果我使用ByteBufferByteBuffer.allocate构建buffer.put(..),然后以相同的方式发送,则客户端会收到零长度消息。

踢球者是如果我在发送之前构建字节缓冲区,而是发送 ByteBuffer.wrap(buffer.array()),一切都很完美!

因此,无论jetty websocket服务器发生了什么,显然还有一些副作用,我在打开和包装字节时缺少这些副作用。我认为它全部由内存中的相同数据支持,因此我不会认为我为此付出了很多代价,但感觉 suuuper hacky,我很想知道这里发生了什么!

谢谢!

编辑:FWIW,它与字节序无关 - 两个字符串(?)与ByteBuffer.wrap(buffer.array())一起使用,否则不起作用。

1 个答案:

答案 0 :(得分:1)

你需要在发送缓冲区之前重置缓冲区的位置,因为put方法(采取索引的方法除外)在调用时增加位置,而jetty显然使用位置来决定什么发送。

您可以使用flip将位置设置为0,丢弃标记,并将限制设置为上一个位置,或rewind不会更改缓冲区的限制,或者使用position,如果该标记大于您传递的标记并且不会更改限制,则会丢弃标记。

wrap(byte[])有效,因为它将位置设置为0,并将限制为您传递的数组的长度。