3

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

  1. 谁负责重新连接?是客户端吗?
  2. 双方(客户端和服务器)是否必须做一些事情才能支持重新连接机制?
  3. 这是一个额外的问题 - 如何实现套接字冗余(使用多个服务器的能力)。我是否必须将所有连接保留在会话存储(redis)中?在这种情况下如何处理重新连接?

我尽量让这个问题保持一般性,但如果您有兴趣,我的应用程序是用 Flex 编写的,并使用 FlashSocket.IO 连接到我的服务器(Tornado + Tornadio2 + tornadoredis)

4

3 回答 3

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

是的。

  • 双方(客户端和服务器)是否必须做一些事情才能支持重新连接机制?

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

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

当第一个失败时连接到另一个服务器。

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

不,那只会浪费连接。

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

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

于 2013-05-23T06:53:39.093 回答
0

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

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

于 2014-04-22T19:41:59.887 回答
-1

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

于 2013-05-23T06:46:41.250 回答