服务器重启后如何重新连接到套接字

时间:2013-05-23 06:06:51

标签: sockets

我正在使用套接字构建一个实时失效的应用程序,当我有一些工作时,一旦我重新启动服务器似乎停止工作(心跳不再发送)。 在试图找到治疗方法的过程中,我意识到我并不完全理解整个概念,所以我决定在这里发表几个问题:

  1. 谁负责重新连接?是客户吗?
  2. 双方(客户端和服务器)是否必须采取措施才能支持重新连接机制?
  3. 这是一个额外的问题 - 如何实现套接字冗余(使用多个服务器的能力)。我是否必须将所有连接保留在会话存储中(redis)?在这种情况下如何处理重新连接?
  4. 我试着保持这个问题的一般性,但如果您感兴趣,我的应用程序是用Flex编写的,并使用FlashSocket.IO连接到我的服务器(Tornado + Tornadio2 + tornadoredis)

3 个答案:

答案 0 :(得分:2)

  
      
  • 谁负责重新连接?是客户吗?
  •   

  
      
  • 双方(客户端和服务器)是否必须采取措施才能支持重新连接机制?
  •   

服务器必须首先执行它所做的事情:接受连接。客户端还必须首先执行它所做的事情:创建连接。

  
      
  • 这是一个额外的问题 - 如何实现套接字冗余(使用多个服务器的能力)。
  •   

当第一个服务器发生故障时连接到另一台服务器。

  

我是否必须在会话存储中保留所有连接(redis)?

没有。这只会浪费关系。

  

如何在这种情况下处理重新连接?

在任何情况下处理它们的方式相同。只需从客户端重新连接即可。但是,如果您有多个故障转移服务器,您不希望重新连接到刚刚失败的服务器,则需要创建与故障转移服务器组的其他成员的新连接。

答案 1 :(得分:0)

对于遇到此问题的任何人来说,知道套接字是否已关闭的最简单方法是send()或recv()返回0(或-1)。但是,我认为发送()0字节也是可能的,此时recv()在技术上仍然可以返回0,但保持打开状态。

我想你可以通过等待几秒钟并再次尝试发送()来处理这种情况。如果确实关闭了,并且您尝试向套接字发送()数据,那么您将返回-1。如果它再次为零,那么这意味着recv()结束没有内存让缓冲区接受任何东西。

答案 2 :(得分:-1)

通常,如果需要,客户负责检测和重新连接。根据客户端和服务器之间共享的状态,两者都可能有一些“重启”状态。恢复过程,例如,如果客户端在服务器上持有锁,则服务器应释放客户端断开连接的锁,客户端必须获取新锁。这在很大程度上取决于您的客户端和服务器的功能。如果您想拥有分布式/群集服务,那么上面的大部分内容仍然是正确的。它更复杂,因为服务器之间共享服务器状态,您必须同步它。可能你不想自己实现这个并使用现有的解决方案之一 - redis,mongodb,apache-zookeeper ....

相关问题