将 Java ByteBuffer 转换为 JavaScript ArrayBuffer

问题描述

我喜欢从 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' ))
,

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

enter image description here

dataIO.buffer.slice(4)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...