这里的背景是我使用jetty websocket服务器连接到客户端上的javascript。服务器具有套接字端点,您可以通过它发送ByteBuffer
。
奇怪的是,如果我构建一个数组bytes[]
并发送ByteBuffer.wrap(byteArray)
,它就可以了。
如果我使用ByteBuffer
和ByteBuffer.allocate
构建buffer.put(..)
,然后以相同的方式发送,则客户端会收到零长度消息。
踢球者是如果我在发送之前构建字节缓冲区,而是发送
ByteBuffer.wrap(buffer.array())
,一切都很完美!
因此,无论jetty websocket服务器发生了什么,显然还有一些副作用,我在打开和包装字节时缺少这些副作用。我认为它全部由内存中的相同数据支持,因此我不会认为我为此付出了很多代价,但感觉 suuuper hacky,我很想知道这里发生了什么!
谢谢!
编辑:FWIW,它与字节序无关 - 两个字符串(?)与ByteBuffer.wrap(buffer.array())
一起使用,否则不起作用。
答案 0 :(得分:1)
你需要在发送缓冲区之前重置缓冲区的位置,因为put
方法(采取索引的方法除外)在调用时增加位置,而jetty显然使用位置来决定什么发送。
您可以使用flip
将位置设置为0,丢弃标记,并将限制设置为上一个位置,或rewind
不会更改缓冲区的限制,或者使用position
,如果该标记大于您传递的标记并且不会更改限制,则会丢弃标记。
wrap(byte[])
有效,因为它将位置设置为0,并将限制为您传递的数组的长度。