重用Javascript TypedArray(例如Uint32Array)

时间:2013-01-16 20:13:56

标签: javascript node.js websocket

我在Javascript游戏中使用typed arrays在客户端(在浏览器中运行)和服务器(运行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?)来填充消息的长度。当读取套接字另一端的值时,我怎么知道这个填充何时开始?

在撰写所有这些内容时,我发现了另一个问题:这是否值得付出努力?

使用的库

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

1 个答案:

答案 0 :(得分:1)

据我所知,一旦Uint*Array被构造,就无法改变它的长度,你只能从中获得子数组。

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

使用子阵列可能是你想要的,构造你的最大长度数组,填充它,然后使用maxMessageSize来获得你想要的实际数组。我不确定这是否比每次构建新的都有任何优势。