Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 如何在服务器重新启动后重新连接到套接字_Sockets - Fatal编程技术网

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

Sockets 如何在服务器重新启动后重新连接到套接字,sockets,Sockets,我正在使用套接字构建一个具有实时失效的应用程序,当我有一些东西在工作时,它似乎会在我重新启动服务器后停止工作(心跳不再发送)。 在试图找到治疗方法的过程中,我意识到我并不完全理解整个概念,因此我决定在这里发布几个问题: 谁负责重新连接?是客户吗 为了支持重新连接机制,双方(客户端和服务器)都必须做些什么吗 这是一个额外的问题-如何实现套接字冗余(使用多台服务器的能力)。我必须在会话存储(redis)中保留所有连接吗?在这种情况下,如何处理重新连接 我尽量将这个问题概括起来,但如果您感兴趣,我的应

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

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

  • 我尽量将这个问题概括起来,但如果您感兴趣,我的应用程序是用Flex编写的,并使用FlashSocket.IO连接到我的服务器(Tornado+Tornadio2+TornadRedis)

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

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

    • 为了支持重新连接机制,双方(客户端和服务器)都必须做些什么吗
    服务器必须做它首先做的事情:接受连接。客户机还必须做它最初做的事情:创建连接

    • 这是一个额外的问题-如何实现套接字冗余(使用多台服务器的能力)
    在第一台服务器出现故障时连接到另一台服务器

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

    不,那只会浪费连接

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


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

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


    我想您可以处理这种情况,只需等待几秒钟,然后再次尝试send()。如果它确实已关闭,并且您尝试将()数据发送到套接字,那么您将返回-1。如果它再次为零,则表示接收端没有内存供缓冲区接收任何内容

    谢谢EJP的简明回答。这是有道理的。。。客户端如何知道连接何时断开?如果x秒内没有心跳,则超时?@如果您设置了读取超时,则客户端将获得读取超时,或者在写入时“连接重置”。谢谢tigran。我不熟悉插座锁。你能详细说明一下吗?没有插座锁这样的东西。我看不出这如何回答你的任何问题-1@EJP没有人谈论插座锁。任何数据库都会在客户端断开连接时回滚未提交的事务和表锁。