【问题标题】:Socket.io Extra Placeholder Frame being sent正在发送 Socket.io 额外占位符帧
【发布时间】:2016-05-25 18:10:23
【问题描述】:

下面的代码产生了一个神秘的第三帧: 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])
});

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

【问题讨论】:

  • 这方面有什么进展吗?

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


【解决方案1】:

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

由于您只为事件“clientMsg”发送了一个对象,它以占位符对象作为整个主体发送事件,并带有二进制数据的后续。

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

不幸的是,我还意识到添加二进制文件的开销非常大,除了代码之外我找不到太多文档。

【讨论】:

  • 是的,这就是 socket.IO 将二进制消息映射到服务器上的 on(message) 事件的方式。这对我们来说开销很大,所以我们切换到服务器上的 WebSocket (ws) 和客户端上的本机 websocket。我们还使用 schemapack 发送二进制数据,这使得二进制消息的编码和解码和路由变得非常容易:npmjs.com/package/schemapack
  • 有趣的@JaredSprague,因为易于集成,我们默认使用 msgpack-lite,但我现在会检查 schemapack,谢谢。至于减少开销,我们正在调查 webrtc html5rocks.com/en/tutorials/webrtc/datachannels,因为浏览器中可能会出现 udp 样式的不可靠消息
猜你喜欢
  • 1970-01-01
  • 2021-07-15
  • 2016-02-24
  • 2022-12-13
  • 1970-01-01
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 2018-04-13
相关资源
最近更新 更多