【问题标题】:Keeping python sockets alive in event of connection loss在连接丢失的情况下保持 python 套接字处于活动状态
【发布时间】:2023-03-11 06:50:01
【问题描述】:

我正在尝试建立一个可以保持活动状态的套接字连接,以便在连接丢失的情况下。所以基本上我想保持服务器始终打开(最好也是客户端)并在连接丢失后重新启动客户端。但是,如果一端关闭,则两端都关闭。我通过将两端都放在同一台计算机上"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"),如果返回错误,则尝试连接到"localhost" 的代码再次开始。该服务器是一个非常通用的服务器设置,在x.accept() 周围有一个while 循环。那么如何在连接关闭时保持它们都处于活动状态,以便它们在再次打开时可以重新连接。还是我的代码没问题,只是在同一台计算机上模拟就搞砸了?

【问题讨论】:

  • TCP 不能“保持连接活动” - 所以至少有两个选择:1. 使用 UDP,它是无连接的,并在所有需要的层之上进行传输数据可靠且受流量控制(即复制相当多的 TCP 堆栈:-o,或 2)继续使用 TCP,但在其之上添加一个层,以便当客户端重新连接时,客户端会提供一些特定于客户端的信息(a令牌/cookie) 到服务器,它允许服务器恢复以前的连接。这是您的浏览器可以使用 cookie 恢复与服务器的 Web 会话的方式。
  • 你有我如何添加图层的例子吗?我比较新。谢谢
  • 当客户端连接时,它可以自动发送一条消息说“这是我的令牌,它是旧的”或“没有令牌”,如果客户端没有保存一个。在服务器上,对于新的 TCP 连接,等待令牌信息并验证令牌(例如,服务器是否有它的记录?是不是太旧了?用户注销了吗?)并适当地处理。例如如果客户端已注销,则用户需要重新验证。如果未注销最后一个连接是最近的,则恢复会话。这正是网站使用浏览器中的 cookie 记住用户并保留购物篮的方式。

标签: python sockets networking connection


【解决方案1】:

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

这完全取决于您所说的“连接丢失”。

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

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

  • 如果您突然终止服务器:您的操作系统的 TCP/IP 实现将知道没有任何进程正在侦听端口 5000,并将完全关闭与该端口的所有连接。这样做时,客户端会发生一些 TCP 段交换(这是 TCP 4 路拆除或重置),并且所有客户端都将断开连接。重要的是要了解这是在 TCP/IP 实现级别(即您的操作系统)完成的。

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

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

...一旦关闭,不可能您可以像以前一样重新建立这些连接。您必须建立新的连接。

如果您想建立这些新连接并将应用程序逻辑恢复到之前的状态,那是另一个话题了。在这里,仅 TCP 无法为您提供帮助。您需要一个更高级别的协议,也许是您自己的,来实现有状态的客户端/服务器应用程序。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-07-08
      • 1970-01-01
      • 2018-04-13
      • 2013-09-23
      • 2011-07-03
      • 2013-11-08
      • 2012-01-03
      • 2021-09-13
      • 2013-08-27
      相关资源
      最近更新 更多