这里的背景是我正在使用 jetty websocket 服务器连接到客户端上的 javascript。服务器具有套接字端点,您可以通过它们发送ByteBuffer
。
奇怪的是,如果我构建一个数组 bytes[]
并发送 ByteBuffer.wrap(byteArray)
,它就会起作用。
如果我使用 ByteBuffer.allocate
和 buffer.put(..)
构建 ByteBuffer
,然后以相同的方式发送它,客户端收到零长度消息。
最关键的是,如果我建立字节缓冲区并在发送之前,我会发送
ByteBuffer.wrap(buffer.array())
,一切正常!
因此,无论 jetty websocket 服务器中发生了什么,显然我在解包和包装字节时缺少一些副作用。我认为都是由内存中相同的数据支持的,所以我认为我并没有为此付出太多成本,但感觉suuuper em> hacky,我很想知道这里发生了什么!
谢谢!
编辑:FWIW,它与字节序无关 - 两个字节序(?)都与 ByteBuffer.wrap(buffer.array()) 一起使用,否则不起作用。
最佳答案
您需要在发送之前重置缓冲区的位置,因为 put
方法(带索引的方法除外)在调用时会增加位置,而 jetty 显然使用该位置决定发送什么内容。
您可以使用 flip
来完成此操作,它将位置设置为 0,丢弃标记,并将限制设置为前一个位置,或者使用 rewind
来完成此操作,这不会更改缓冲区的限制,或使用 position
如果标记大于您传递的新位置并且不更改限制,则将丢弃该标记。
wrap(byte[])
之所以有效,是因为它将位置设置为 0,并将限制设置为您传递的数组的长度。
关于java - (有必要吗?)ByteBuffer.wrap(buffer.array()) 的副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27210099/