将Java ByteBuffer转换为JavaScript ArrayBuffer

将Java ByteBuffer转换为JavaScript ArrayBuffer,javascript,java,arrays,bytebuffer,arraybuffer,Javascript,Java,Arrays,Bytebuffer,Arraybuffer,我喜欢从JavaScript向WebSocket服务器发送一个ArrayBuffer,它将二进制文件返回给网络中的其他客户端 我的问题是,我不知道如何将ArrayBuffer从JavaScript 1:1发送到服务器,再从服务器发送回客户端 我尝试了一个简单的ByteBuffer,但它只发送一个数组元素。 然后我试着: InputStream arrayIO = new ByteArrayInputStream(payloadIO); ByteBuffer buf

我喜欢从JavaScript向WebSocket服务器发送一个ArrayBuffer,它将二进制文件返回给网络中的其他客户端

我的问题是,我不知道如何将ArrayBuffer从JavaScript 1:1发送到服务器,再从服务器发送回客户端

我尝试了一个简单的ByteBuffer,但它只发送一个数组元素。 然后我试着:

        InputStream arrayIO = new ByteArrayInputStream(payloadIO);
        ByteBuffer bufferIO = ByteBuffer.allocate(payloadIO.length + 1);

        while (arrayIO.available() > 0) {
            bufferIO.put((byte) arrayIO.read());
        }

        for (Session rowIO : sessionsIO.values()) {
            if (rowIO.isOpen()) {
                rowIO.getRemote().sendBytes(bufferIO);
            }
        }
这给了我:

Buffer [0]
0: 0
offset: (...)
parent: (...)
buffer: (...)
byteLength: (...)
byteOffset: (...)
length: (...)
Symbol(Symbol.toStringTag): (...)
__proto__: Uint8Array

在JavaScript部分。

您可以将字节转换为字符串列表,然后将其解析回二进制字节

class ArrayBufferUtil {
  static toString(buffer) {
    return new Uint8Array(buffer).toString()
  }
  
  static parse(s) {
    return new Uint8Array(
      s.split(',').map(i => parseInt(i, 10))
    ).buffer
  }
}
测试

console.log( ArrayBufferUtil.toString( new ArrayBuffer(8) ))
console.log( ArrayBufferUtil.parse( '0,0,0,0,0,0,0,0' ))

我通过在客户端接收站点上添加一个偏移量来修复它。 服务器在前4个字节上发送操作码(RFC6455)

dataIO.buffer.slice(4)