【问题标题】:Socket.io emit() delay / buffer flush?Socket.io emit() 延迟/缓冲区刷新?
【发布时间】:2023-03-04 22:15:01
【问题描述】:

我正在使用socket.io 向浏览器发送消息。在 node.js 方面我正在做

socket.emit('message', data);

在浏览器端我正在做

socket.on('message', handleData);

现在这工作正常。出于测试目的,我手动触发(从节点检查器控制台)socket.emit()。我可以这样做 2-3 次,之后下一条消息需要很长时间才能传递。大约 10 秒。

我的信息很短。启用压缩并且对象 JSON {"could be about": "this long"}。当使用更长的字符串进行测试时,所有消息都会立即发送。所以这与缓冲/优化有关,但在我们的例子中,所有消息都立即发送很重要。

有人对这种延迟有任何见解吗?谢谢

【问题讨论】:

  • 这篇文章或许值得一读:TCP Performance Gotchas
  • @jfriend00 不,顺其自然。也许有人会遇到同样的问题
  • @OlavKokovkin 你是怎么解决这个问题的?我也遇到了同样的问题。
  • 我也有同样的问题。有时我按下发送,它立即发送......有时我按下发送,最多需要 20 秒,或者我只是再次按下发送(!)它立即出现......这对我来说似乎是一个错误也是?!
  • @Informatic0re 你让它工作了吗?我遇到了同样的问题,尝试了开始聊天,有时一条消息需要 1ms 其他 10 秒。

标签: javascript node.js socket.io


【解决方案1】:

官方文档链接(v4.0):

https://socket.io/docs/v4/client-offline-behavior/

确实有三种方法可以在客户端对抗缓冲:

  • 使用Socket实例的connected属性
if (socket.connected) {
  socket.emit( /* ... */ );
} else {
  // ...
}
  • 使用易变事件
socket.volatile.emit( /* ... */ );
  • 重新连接时清空内部缓冲区
socket.on("connect", () => {
  socket.sendBuffer = [];
});

关于 volatile 发射的文档:

https://socket.io/docs/v4/emitting-events/#Volatile-events

【讨论】:

  • 终于,5年后!谢谢,现在我已经关闭了
【解决方案2】:

我遇到了同样的问题。 虽然已经有好几年了,但这些技巧对其他有问题的人来说还是有用的。

  1. How To Cancel, Timeout, or Clear Queued Messages In Socket.IO

  2. https://github.com/feathersjs/feathers/issues/1532

    socket.on('connect', function() { socket.sendBuffer = []; // 做东西 });

    socket.on('重新连接', function() { socket.sendBuffer = []; });

【讨论】:

    猜你喜欢
    • 2016-11-19
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 2011-11-28
    相关资源
    最近更新 更多