ws:从客户端接收数据作为ArrayBuffer

问题描述 投票:0回答:1

我正在使用nodejs中的

ws
库与其他玩家一起创建一个小光标大厅。我已经成功地实现了使用服务器将带有位流的 ArrayBuffer 发送到客户端,并在客户端上成功读取它们,但是当我以其他方式发送流时,我不知道如何将它们转换为 ArrayBuffer。

这是我的服务器代码,它从客户端接收数据。然而,

data
变量似乎返回了带有切碎数据的
buffer
,这给比特流解码带来了麻烦。我想知道如何接收
data
变量作为 ArrayBuffer。

const server = new ws.Server({
    port: 3001,
    maxPayload: 1024
});
// ...
socket.on("message", (data) => { // <- the data variable here seems to be the problem
    const stream = new BitStream(data);
    const messageType = stream.readUint8();
    switch(messageType) {
        case ClientMessageType.TICK: {
            const x = stream.readUint16();
            const y = stream.readUint16();
            plrCursor.pos = [x, y];
            updatedCursors.push(plrCursor.id);
            console.log(`Cursor ${plrCursor.id} moved to ${x}, ${y}`);
        }
    }
});

这是发送数据的客户端代码:

document.addEventListener("mousedown", (event) => {
    if(!connected) return;
    const stream = new BitStream(new ArrayBuffer(8 + 16 * 2));
    stream.writeUint8(ClientMessageType.TICK);
    stream.writeUint16(event.clientX);
    stream.writeUint16(event.clientY);
    socket.send(stream.buffer);
    console.log(`Sent tick: ${event.clientX}, ${event.clientY}`);
});

它发送缓冲区并记录它发送的位置,但是当在服务器上处理 MessageType 时,它会返回

130
,而
ClientMessageType.TICK
1
。 我无法确定问题出在哪里。
我猜测服务器将其作为缓冲区/Uint8Array 读取是问题所在,但我不知道如何让 ws 在客户端发送时将二进制数据作为 ArrayBuffer 返回。奇怪的是,它适用于服务器 -> 客户端,但不适用于客户端 -> 服务器,因此任何指针都会有所帮助。

javascript node.js typescript arraybuffer ws
1个回答
0
投票

原来我对缓冲区的处理方式不正确。将其切片到偏移量和长度可以解决这个问题;发布此内容是为了帮助其他碰巧使用位缓冲区库的人。

socket.on("message", (data: Buffer) => {
    const pkt = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength); // this is new
    const stream = new BitStream(pkt);
    const messageType = stream.readUint8();
    switch(messageType) {
        case ClientMessageType.TICK: {
            const x = stream.readUint16();
            const y = stream.readUint16();
            plrCursor.pos = [x, y];
            updatedCursors.push(plrCursor.id);
        }
    }
});
© www.soinside.com 2019 - 2024. All rights reserved.