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

标签 java websocket bytebuffer

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

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

如果我使用 ByteBuffer.allocatebuffer.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/

相关文章:

java - 具有不同包名称的相同 Android 应用程序

java - ByteBuffer 返回空字符(字符 0)

c# - 将字节缓冲区转换为 UTF8 字符串

java - 使用 java-websocket 库连接到 coinbase exchange websocket 流时,Draft 拒绝握手

typescript - NestJS - WebsocketGateway 中的 ValidationPipe 返回内部服务器错误

c# - 在 .net 4.5 中使用 ClientWebSocket 时如何设置 User-Agent 和 Referer header ?

java - 从 Java ByteBuffer 中的字节获取低阶和高阶 nybbles

java - 如何从文本文档中预测连续值(时间)?

java - JPA 中的引用完整性约束违规错误

java - 在Java中如何在jframe组件之间传递变量和列表