Sockets 如何在服务器重新启动后重新连接到套接字
我正在使用套接字构建一个具有实时失效的应用程序,当我有一些东西在工作时,它似乎会在我重新启动服务器后停止工作(心跳不再发送)。 在试图找到治疗方法的过程中,我意识到我并不完全理解整个概念,因此我决定在这里发布几个问题:Sockets 如何在服务器重新启动后重新连接到套接字,sockets,Sockets,我正在使用套接字构建一个具有实时失效的应用程序,当我有一些东西在工作时,它似乎会在我重新启动服务器后停止工作(心跳不再发送)。 在试图找到治疗方法的过程中,我意识到我并不完全理解整个概念,因此我决定在这里发布几个问题: 谁负责重新连接?是客户吗 为了支持重新连接机制,双方(客户端和服务器)都必须做些什么吗 这是一个额外的问题-如何实现套接字冗余(使用多台服务器的能力)。我必须在会话存储(redis)中保留所有连接吗?在这种情况下,如何处理重新连接 我尽量将这个问题概括起来,但如果您感兴趣,我的应
我尽量将这个问题概括起来,但如果您感兴趣,我的应用程序是用Flex编写的,并使用FlashSocket.IO连接到我的服务器(Tornado+Tornadio2+TornadRedis)通常,客户端负责检测并在需要时重新连接。根据客户端和服务器之间共享的状态,两者可能都有一些“重新启动”恢复过程,例如,如果客户端持有服务器上的锁,则服务器应在客户端断开连接时释放锁,客户端必须获取新锁。这在很大程度上取决于客户端和服务器的工作。如果您想要一个分布式/集群服务,那么上面的大部分仍然是正确的。这更复杂,因为服务器之间共享服务器状态,您必须同步它。也许你不想自己实现这个,而使用现有的解决方案——redis、mongodb、ApacheZooKeeper
- 谁负责重新连接?是客户吗
- 为了支持重新连接机制,双方(客户端和服务器)都必须做些什么吗
- 这是一个额外的问题-如何实现套接字冗余(使用多台服务器的能力)
在任何情况下处理它们的方式都是一样的。只需从客户端重新连接即可。但是,如果您有多个故障转移服务器,您不希望重新连接到刚刚发生故障的服务器,您可能希望创建到故障转移服务器组中其他成员的新连接。对于遇到此问题的任何人,最简单的方法是在send()或recv()返回0(或-1)时知道套接字是否已关闭。但是,我认为也可以发送()0字节,此时recv()在技术上仍然可以返回0,但保持打开状态
我想您可以处理这种情况,只需等待几秒钟,然后再次尝试send()。如果它确实已关闭,并且您尝试将()数据发送到套接字,那么您将返回-1。如果它再次为零,则表示接收端没有内存供缓冲区接收任何内容 谢谢EJP的简明回答。这是有道理的。。。客户端如何知道连接何时断开?如果x秒内没有心跳,则超时?@如果您设置了读取超时,则客户端将获得读取超时,或者在写入时“连接重置”。谢谢tigran。我不熟悉插座锁。你能详细说明一下吗?没有插座锁这样的东西。我看不出这如何回答你的任何问题-1@EJP没有人谈论插座锁。任何数据库都会在客户端断开连接时回滚未提交的事务和表锁。