我正在尝试通过二进制套接字将浏览器中的类型化数组(Uint16Array)发送到node.js,但是当我在node中接收到它们时,值却变得不一致。
我读了很多文档,但是有些东西我不明白...

这是浏览器端的代码:

var ws = new WebSocket('ws://127.0.0.1:8080');
ws.binaryType = "arraybuffer";

var message = new Uint16Array(3);
message[0] = 123;
message[1] = 456;
message[2] = 789;

ws.onopen = function() {
    ws.send(message.buffer);
};

这是服务器代码(我正在使用https://github.com/einaros/ws):
    var WebSocketServer = require('ws').Server;
    var wss = new WebSocketServer({port: 8080});
    wss.on('connection', function(ws) {

        ws.on('message', function(buffer, flags) {

            var message = new Uint16Array(buffer);
            console.log(message[0]); // 123
            console.log(message[1]); // 0
            console.log(message[2]); // 200

        });
    });

您是否知道这种变化的来源?谢谢大家 !

迪米特里

最佳答案

答案很晚,但看起来好像ws将类型化的数组展平为字节大小的缓冲区。 123很好,因为它适合uint16的低字节。 0是123的高字节。200只是456的低字节:

456 & 0xFF // 200

您在服务器的消息处理程序中收到的缓冲区的长度应该是您发送的Uint16Array的两倍。您必须自己手动重建uint16。
var WebSocketServer = require('ws').Server;
var wss = new WebSocketServer({port: 8080});

// Pre-allocate so we're not incurring allocation overhead on every message
var message = new Uint16Array(3);

wss.on('connection', function(ws) {
    ws.on('message', function(buffer, flags) {
        for (var i = 0; i < uint16Array.length; i++) {
            message[i] = buffer[2*i] | message[2*i+1] << 8;
        }

        console.log(message[0]); // 123
        console.log(message[1]); // 456
        console.log(message[2]); // 789
    });
});

10-08 16:21