在连接丢失的情况下保持 python 个套接字处于活动状态

Keeping python sockets alive in event of connection loss

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

无论如何我的连接代码 m.connect(("localhost", 5000))iftrywhile 中,例如

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"),如果 returns 出现错误,尝试连接到 "localhost" 的代码将再次启动。服务器是一个非常通用的服务器设置,在 x.accept() 周围有一个 while 循环。那么如何在连接关闭时让它们都保持活动状态,以便在连接再次打开时它们可以重新连接。还是我的代码没问题,只是在同一台计算机上模拟就搞砸了?

我假设我们在这里处理 TCP,因为你使用了 "connection" 这个词。

这完全取决于你所说的"connection loss"。

如果你所说的连接丢失是指服务器和客户端之间的数据交换可能suspended/irresponsive(重要:我这里没有说"closed")很长一段时间,秒或几分钟,那么您对此无能为力,这很好,因为 TCP 协议经过精心设计,可以优雅地处理此类情况。在决定一方或另一方之前的超时肯定是失败的,放弃,并关闭连接非常长(分钟)。这种情况的例子:客户端是你的智能手机,连接到网络上的某个服务器,然后你进入一个长隧道。

但是当你说:"But if one end shuts down both ends shut down. I simulated this by having both ends on the same computer localhost and just clicking the X button",你实际上是在关闭连接。

  • 如果您突然终止服务器:您的操作系统的 TCP/IP 实现将知道不再有进程侦听端口 5000,并将干净利落地关闭与该端口的所有连接港口。这样做时,将与客户端发生一些 TCP 段交换(这是 TCP 4 向拆除或重置),并且所有客户端都将断开连接。重要的是要了解这是在 TCP/IP 实现级别完成的,也就是说您的操作系统。

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

  • 在两个 cases/side 中,在网络级别,这与您在代码中明确(不是突然)关闭连接是一样的。

...一旦关闭,您就无法重新建立这些连接,就像它们以前一样。您必须建立新的连接。

如果您想建立这些新连接并将应用程序逻辑恢复到之前的状态,那是另一个话题了。单靠 TCP 无法帮助您。您需要更高级别的协议,也许是您自己的协议,以实现有状态 client/server 应用程序。

问题与编程语言无关,在本例中为 python。操作系统(Windows或linux)对插座的弹性程度有最终决定权。