Socket.io 数据包在断开连接和重新连接之间丢失

Socket.io packets get lost between dis- and reconnect

本文关键字:重新连接 之间 连接 io 数据包 断开 Socket      更新时间:2023-09-26

我正在使用 socket.io 将智能手机(在网络框架中(连接到服务器并发送一些消息(每分钟几个短字符串,没什么大不了的(。由于智能手机的连接往往不稳定,因此 socket.io 被迫时不时地重新连接。它会自动执行此操作,并且在它注意到连接当前不可用后我希望它发送的消息将被缓冲并在重新建立连接后作为捆绑包发送。所以基本上一切都很顺利 socket.io。

但是,当我在 socket.io 注意到连接消失之前发送消息时,消息会丢失。它不能被传输,但它也不会被 socket.io 缓冲。我对 socket.io 很满意,但这个问题困扰着我,因为我不会发送很多消息,但我真的需要我发送的消息可靠地发送。建立连接后,所有消息都会完美传输,所以我不需要检查。只有连接丢失和 socket.io 注意到它之间的一秒钟是我面临丢包的关键时刻。

我一直在考虑用序列号和 ACK 模仿 TCP 行为,但这感觉有点像用火箭发射器射击蚂蚁。所以我的问题是:有没有人对这个问题有轻量级的解决方案,甚至自己也遇到过?我什至不要求显式代码 - 我可以自己做 - 但是摆脱这个特定问题的概念或类似的东西会很棒。

提前感谢!

为什么不将每条消息记录到数据库中?并使用 socket.io 确认选项使其变得更好。

从 http://socket.io/#how-to-use服务器

var io = require('socket.io').listen(80);
io.sockets.on('connection', function (socket) {
  socket.on('ferret', function (name, fn) {
    fn('woot');
  });
});

客户

<script>
  var socket = io.connect(); // TIP: .connect with no args does auto-discovery
  socket.on('connect', function () { // TIP: you can avoid listening on `connect` and listen on events directly too!
    socket.emit('ferret', 'tobi', function (data) {
      console.log(data); // data will be 'woot'
    });
  });
</script>

如果它那么重要,我可能会模仿TCP的天真版本。只需存储一个缓冲区客户端,并让服务器响应以确认消息,否则从缓冲区再次发送。