在连接丢失的情况下保持 python 个套接字处于活动状态
Keeping python sockets alive in event of connection loss
我正在尝试建立一个将保持活动状态的套接字连接,以便在连接丢失的情况下。所以基本上我想保持服务器始终打开(最好是客户端)并在连接丢失后重新启动客户端。但是,如果一端关闭,则两端都关闭。我通过在同一台计算机 "localhost"
上设置两端并单击 X 按钮来模拟此操作。这可能是我问题的根源吗?
无论如何我的连接代码
m.connect(("localhost", 5000))
在 if
和 try
和 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")
,如果 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)对插座的弹性程度有最终决定权。
我正在尝试建立一个将保持活动状态的套接字连接,以便在连接丢失的情况下。所以基本上我想保持服务器始终打开(最好是客户端)并在连接丢失后重新启动客户端。但是,如果一端关闭,则两端都关闭。我通过在同一台计算机 "localhost"
上设置两端并单击 X 按钮来模拟此操作。这可能是我问题的根源吗?
无论如何我的连接代码
m.connect(("localhost", 5000))
在 if
和 try
和 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")
,如果 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)对插座的弹性程度有最终决定权。