2014-04-07 38 views
3

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

编辑:

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

+4

“想象一下真空中的一些球形马” - 你失去了我...... –

+1

撇开SignalR,当然不是协议,内部管道是相同的。但是,编辑完成后,您的问题现在有不同的含义。 :/ – mrahhal

+0

当然,我不是指协议堆栈中的协议。抱歉。我会纠正这个问题。 – Neshta

回答

1

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

如果客户端无法通知服务器它正在关闭连接,则服务器将在删除连接之前等待一段时间(DisconnectTimeout)。 因此,在这种情况下,如果立即重新启动连接,它将是一个新的连接到服务器的新逻辑连接。

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

+0

我已阅读此文。谢谢。 – Neshta

2

你必须把它从客户端,也请注意,如果你使用TCP下面会发生:

TCP确保你的数据包将它们发送的顺序到达。因此,让我们假设在同一时刻,“马”撞上了空间并且连接断开了,服务器正在发送下一个会检查连接的数据包(如果您实现的服务器足够好的话)。

这里,有可能发生两件事情:

  1. 客户已经恢复并可以及时做出反应。意味着连接出现问题的时间间隔足够小,以至于来自服务器的下一个数据包尚未到达。如此回应你的问题,首先就没有断线。
  2. 服务器的下一个数据包到达但客户端没有响应(连接中断)。服务器会立即注意到这一点,引发了OnDisconnected事件。如果客户端在服务器记录的同时虚拟恢复,则它会启动另一个连接(OnConnected)。

所以客户不可能转两次。如果有的话, 断开间隔将足够小,以使服务器不至于首先通知 这个问题。

再次,另一个协议可能会有不同的行为。但TCP旨在保证服务器和客户端之间良好的连接和通信。

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

+0

它在TCP协议中看起来很棒。那么SignalR呢? – Neshta

+0

@Neshta我没有和SignalR ASP.NET一起工作,但我非常肯定它(与所有面向可靠连接的通信一样)在内部使用TCP。但是,即使不这样做,我敢肯定创作者实现了类似的东西,可以给你和我在这里讨论的相同的输出。网络问题非常普遍,通常在流行的框架中防范这些问题。 – mrahhal

相关问题