问题描述
我喜欢从 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)。
dataIO.buffer.slice(4)