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