是否有可能重复的OnConnected将在之前的OnDisconnected之前调用?

时间:2014-04-07 16:48:42

标签: c# signalr

想象一下真空中的一些球形马: 我失去了对客户端应用程序的控制,可能发生了一些错误。我试图立即重新进入枢纽。 是否可能,OnConnected启动速度更快,然后OnDisconnected,我在服务器上出现两次?

编辑:

对不起,我没有说我的意思是SignalR库。我想如果我的应用程序不会调用stop(),服务器将默认等待大约30秒。在调用OnDisconnected之前,我可以再次连接到服务器。不是吗?

2 个答案:

答案 0 :(得分:2)

您必须从客户端获取它,还要注意,如果您使用TCP,则会发生以下情况:

TCP确保您的数据包按照发送顺序到达。所以让我们想象一下,在同一时刻,“马”撞到了空间并且连接断了,你的服务器正在发送下一个检查连接的数据包(如果你实现的服务器足够好)。

在这里,可能会发生两件事:

  1. 客户已经恢复并可以及时回复。这意味着连接出现问题的时间间隔足够小,以至于服务器的下一个数据包尚未到达。所以回答你的问题,首先没有断线。
  2. 来自服务器的下一个数据包已到达但客户端没有响应(连接被切断)。服务器会立即注意到这一点,引发OnDisconnected事件。如果客户端在服务器注意到的同时虚拟恢复,那么它将启动另一个连接(OnConnected)。
  3. 所以客户端不可能再转两次。如果有的话 断开间隔将足够小,服务器不能 首先注意问题。

    同样,另一个协议可能表现不同。但TCP旨在保证服务器和客户端之间建立良好的连接和通信。

    值得一提的是,默认情况下,许多通信框架(如果不是全部)都隐式使用TCP。

答案 1 :(得分:1)

客户端可以在第一个连接打开时第二次连接(但它将具有单独的连接ID)。

如果客户端未设法通知服务器它正在关闭连接,则服务器将等待一段时间后再删除连接(DisconnectTimeout)。 因此,在这种情况下,如果您立即重新启动连接,它将成为具有新连接ID的服务器的新逻辑连接。

SignalR还会在丢失时尝试重新连接到现有连接,在这种情况下,重新连接后它将保留其连接ID。我建议您阅读整个article about SignalR connection lifetime events