正在发送Socket.io额外占位符框架

时间:2016-02-14 23:03:17

标签: javascript sockets websocket socket.io network-programming

以下代码导致神秘的第三帧: 451-["clientMsg",{"_placeholder":true,"num":0}]

Cient

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])
});

上面的代码产生了三个帧,我只期望两个帧,一个从客户端到服务器,一个从服务器到客户端。任何人都可以解释这第三帧是什么,以及如何摆脱它?看截图:

enter image description here

1 个答案:

答案 0 :(得分:1)

查看socket.io的代码,看起来任何时候有一个带有二进制数据的对象,它将用这个占位符事件替换该对象的那部分。然后它按照提供的数字的顺序发送二进制数据。字段,它在客户端重建。

由于您只有一个对象要发送给事件' clientMsg',它会以占位符对象作为整个主体发送事件,并跟踪二进制数据。

请参阅socket.io-parser的binary.js:https://github.com/socketio/socket.io-parser/blob/master/binary.js - 特别是_deconstructPacket_reconstructPacket函数。

我很遗憾地意识到添加二进制文件的开销非常粗糙,除了代码之外我找不到更多文档。