javascript - 通过二进制套接字将 Uint16Array 表单浏览器发送到 node.js

标签 javascript node.js sockets binary

我正在尝试通过二进制套接字将类型化数组(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
    });
});

关于javascript - 通过二进制套接字将 Uint16Array 表单浏览器发送到 node.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22084134/

相关文章:

javascript - Sails Js 中的动态数据库连接

javascript - 在 for 循环中访问对象的键和索引

node.js - 如何从 Express 服务器动态发送新号码到客户端

javascript - Node.js/Express.js。如果与通配符路由器一起使用,则无法识别静态路由器

c++ - 为什么套接字在多线程时不起作用?

javascript - 基金会揭示模式未打开

javascript - 为什么在 Passport.deserializeUser 函数中再次检查用户

android - Phonegap (1.7.0) + node.js + socket.io

node.js - 如何区分 Node.js 中的 UNIX 套接字连接?

c - 如何从 struct sockaddr 生成 struct addrinfo?