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