以下代码导致神秘的第三帧:
451-["clientMsg",{"_placeholder":true,"num":0}]
function sendMessage() {
var bufArr = new ArrayBuffer(4);
var bufView = new Uint8Array(bufArr);
bufView[0]=6;
bufView[1]=7;
bufView[2]=8;
bufView[3]=9;
// send binary message to server
socket.emit('serverMsg', bufArr);
}
sendMessage();
socket.on('serverMsg', function (bufArr) {
var ba = new ArrayBuffer(4);
var bv = new Uint8Array(ba);
bv[0]=10;
bv[1]=11;
bv[2]=12;
bv[3]=13;
var bufView = new Uint8Array(bufArr);
console.log("Data: ", bufView[0], bufView[1], bufView[2], bufView[3]);
// Send message back to client
socket.emit("clientMsg", ba);
});
socket.on('clientMsg', function (bufArr) {
var bufView = new Uint8Array(bufArr);
console.log("Data: ", bufView[0], bufView[1], bufView[2], bufView[3])
});
上面的代码产生了三个帧,我只期望两个帧,一个从客户端到服务器,一个从服务器到客户端。任何人都可以解释这第三帧是什么,以及如何摆脱它?看截图:
答案 0 :(得分:1)
查看socket.io的代码,看起来任何时候有一个带有二进制数据的对象,它将用这个占位符事件替换该对象的那部分。然后它按照提供的数字的顺序发送二进制数据。字段,它在客户端重建。
由于您只有一个对象要发送给事件' clientMsg',它会以占位符对象作为整个主体发送事件,并跟踪二进制数据。
请参阅socket.io-parser的binary.js:https://github.com/socketio/socket.io-parser/blob/master/binary.js - 特别是_deconstructPacket
和_reconstructPacket
函数。
我很遗憾地意识到添加二进制文件的开销非常粗糙,除了代码之外我找不到更多文档。