在连接丢失的情况下保持python套接字存活

时间:2015-09-04 11:33:51

标签: python sockets networking connection

我尝试建立一个可以保持活动的套接字连接,以便在连接丢失的情况下。所以基本上我想保持服务器始终打开(最好也是客户端)并在连接丢失后重新启动客户端。但如果一端关闭,两端都会关闭。我通过将两端放在同一台计算机"localhost"上并且只需单击X按钮来模拟这一点。这可能是我问题的根源吗?

无论如何我的连接代码 m.connect(("localhost", 5000))iftry以及while,例如

while True: if tryconnection: #Error handeling try: m.connect(("localhost", 5000)) init = True tryconnection = False except socket.error: init = False tryconnection = True

在我的代码结尾处,当我按下按钮时,我只是m.send("example"),如果返回错误,则尝试连接到"localhost"的代码将再次启动。服务器是一个非常通用的服务器设置,while周围有一个x.accept()循环。那么如何在连接关闭时让它们保持活着状态,这样它们可以在再次打开时重新连接。或者我的代码是否正常,只是通过在同一台计算机上模拟它就搞乱了?

2 个答案:

答案 0 :(得分:1)

我假设我们在这里处理TCP,因为你使用“连接”这个词。

这完全取决于“连接丢失”的含义。

如果连接丢失意味着服务器和客户端之间的数据交换可能暂停/无响应(重要的是:我在这里没有说“关闭”)很长时间,几秒或几分钟,那么就没有了您可以做很多事情,这很好,因为TCP协议经过精心设计,可以优雅地处理这种情况。在决定一方或另一方之前的超时肯定是关闭,放弃,并且关闭连接是长的(分钟)。这种情况的示例:客户端是您的智能手机,连接到网络上的某个服务器,然后您进入长隧道。

但是当你说:“但如果一端关闭,两端都会关闭。我通过将两端都放在同一台计算机上的本地主机并只点击X按钮来模拟这一点”,你所做的实际上是关闭连接。

  • 如果您突然终止服务器:操作系统的TCP / IP实现将知道没有任何进程正在侦听端口5000,并将干净地关闭到该端口的所有连接。这样做会在客户端进行一些TCP段交换(这是TCP 4路拆卸或重置),并且所有客户端都将被丢弃。重要的是要了解这是在TCP / IP实现级别完成的,也就是说您的操作系统。

  • 如果您突然终止客户端,相应地,操作系统的TCP / IP实现将干净地关闭从其端口Y到服务器端口5000的连接。

  • 在两种情况下/在网络级别,这与您在代码中明确(不是突然)关闭连接的情况相同。

...一旦关闭,无法你就可以像以前一样重新建立这些连接。你必须建立新的联系。

如果你想建立这些新连接并使应用程序逻辑处于之前的状态,那么现在这是另一个主题。仅TCP就无法帮到你。您需要更高级别的协议(可能是您自己的协议)来实现有状态的客户端/服务器应用程序。

答案 1 :(得分:0)

该问题与编程语言无关,在本例中为python。 oeprating系统(Windows或Linux)最后说明了套接字的弹性程度。