0

我在 Javascript 游戏中使用类型化数组在客户端(在浏览器中运行)和服务器(运行 node.js)之间发送数据。我可以来回发送消息没有问题,但我有兴趣重用我的类型化数组,而不是每次发送消息时都创建一个新数组。

这是我的 sendMessage 代码:

function sendMessage(socket, data) {

    // data is JSON
    var encoded = BISON.encode(data);
    if (socket.isBinary) {
        var len = encoded.length,
            bytes = new Uint32Array(len);

        for (var i = 0; i < len; ++i) {
            bytes[i] = encoded.charCodeAt(i);
        }
    }

    if (server && socket.isBinary) {
        socket.send(bytes, { binary: true, mask: false });
    } else {
        socket.send(encoded);
    }

}

这是我的 readMessage 代码:

function readMessage(data) {

    if (data instanceof ArrayBuffer) {
        var bytes = new Uint32Array(data);
        data = String.fromCharCode.apply(null, bytes);
    }
    var message = JSON.stringify(BISON.decode(data));
    return JSON.parse(message);
}

每次发送消息时,我都会创建一个新的 Uint32Array,将其初始化为我打算发送的消息的长度。而不是每次我想为每条消息重用这个数组时都创建一个新数组。

我目前对此的想法是确定我maxMessageSize的并用这个长度初始化数组。maxMessageSize将是可以通过套接字发送的最大允许消息。

问题

大多数消息的大小不太可能完全一致 maxMessageSize。在这些情况下,我需要用一些值(null?)填充消息的长度。在读取套接字另一端的值时,我怎么知道这个填充是什么时候开始的?

在写出所有这些内容时,我想到了另一个问题:这值得付出努力吗?

使用的库

  • ws用于 node.js 中的 websockets
  • BISON用于 json 的二进制编码。
4

1 回答 1

1

据我所知,一旦Uint*Array构造完成,就无法更改其长度,您只能从中获取子数组。

任何填充都必须使用 32 位整数完成,如果您尝试使用null, ,ToInt(null)那么0您将0在该条目中有 a 。如果你想像这样填充,你需要传递一些长度值(数组中的第一个或最后一个条目),你需要在接收端查看它以了解何时修剪数据,这maxMessageSize意味着少一个。

但是,使用子数组可能是您想要的,构造您的最大长度数组,将其填充,然后用于.subarray(0, len)获取您想要的实际数组。我不确定这是否比每次都构建一个新的有任何优势。

于 2013-01-16T20:45:33.963 回答