使用socket.emit

时间:2017-07-08 06:10:18

标签: javascript node.js socket.io

我有一些像这样的node.js客户端代码:

socket.emit('clickAccept', { myrecid: recid });

服务器端node.js代码很好,一切都很好。

如果我将服务器关闭以模拟服务器端中断,那么在客户端单击触发此socket.emit的按钮,会发生这种情况:

  • 没什么,我想最终可能会超时
  • 当我重新启动服务器时,点击最终会被发送到服务器并且服务器会对它们起作用(类似TCP的猜测)。

我想要发生的是那些socket.emit次呼叫在短暂超时后死亡而不是在服务器恢复时发送,它会引起各种混乱,因为如果他们点击3次,则没有任何反应,那么当/如果连接或服务器恢复时,他们一次得到3个反应。

此外,如果他们点击并因服务器关闭而超时,我想向客户端用户显示错误,让他们知道基本上点击不起作用并再试一次。

我知道如果套接字故障,如何操作并显示错误,但如果他们当时没有尝试点击某些内容,我也不想这样做。没有任何意义是在用户处触发错误,因为如果他们当时没有必要做任何事情,套接字会短暂停止。

因此,要清楚,我只想在他们点击按钮并且客户端和服务器之间的套接字关闭时显示错误。 AND ...如果他们收到错误,我想杀掉那些发射,而不是将它全部保存起来并在几秒钟后服务器重新启动时触发它以及所有其他点击。

提前致谢,我希望这至少是相当清楚的。

2 个答案:

答案 0 :(得分:2)

感谢您的其他答案和帮助。我最终以一种非常简单的方式解决了这个问题。见下文:

if (socket.connected){ // Do your thing here } else { // Throw error here that tells the user they're internet is likely down }

希望这可以帮助那些人,我们的代码是一个巨大的改进,以确保用户在他们有短暂的网络/互联网中断时获得适当的反馈。

答案 1 :(得分:1)

您的问题的根源是socket.io尝试缓冲它当前无法发送到服务器的任何数据(因为与服务器的连接断开连接)以及服务器重新启动和连接时恢复后,它会发送该数据。

您可以在此处查看有关其工作原理的技术细节:socket.io stop re-emitting event after x seconds/first failed attempt to get a response

您有多种实施方案:

  1. 如果socket.io已经知道客户端没有连接到服务器,那么就不要缓冲数据(甚至可能会给你一个错误,以便向用户显示)。

    < / LI>
  2. 当socket.io重新连接并且在连接断开时缓冲数据时,清除该数据并将其丢弃,以便在重新连接时不发送旧数据。

  3. 实施超时以在某种超时后执行上述操作之一。

  4.   

    因此,要清楚,我只想在他们点击按钮并且客户端和服务器之间的套接字关闭时显示错误。 AND ...如果他们收到错误,我想杀掉那些发射,而不是将它全部保存起来并在几秒钟后服务器重新启动时触发它以及所有其他点击。

    可能最简单的方法是实现上面引用的答案中显示的版本:

    Socket.prototype.emitWhenConnected = function(msg, data) {
        if (this.connected) {
            this.emit(msg, data);
            return null;
        } else {
            return new Error("not connected");
        }
    }
    

    然后,将代码从使用.emit()切换为使用.emitWhenConnected(),并在使用时检查返回值。如果返回值为null,则未检测到错误。如果返回值不为null,则表示存在错误。