【问题标题】:Will a python socket timeout?python套接字会超时吗?
【发布时间】:2014-05-13 22:13:32
【问题描述】:

我正在尝试在 python 中创建一个客户端服务器程序,我想知道一旦建立连接,除非我以某种方式关闭连接,否则它会超时吗?

如果是这样,有没有办法保持连接打开?还是一个保持连接始终打开的标志??

基本上我希望客户端连接并无限期地保持连接。

【问题讨论】:

  • 如果您控制了服务器部分,请考虑使用 zmq 作为通信方法,它将提供许多简单的工作功能,例如自动重新连接等。
  • 网络不可靠!套接字将因多种原因而死,不要像不会那样设计您的程序。
  • 感谢您的建议,我将确保我的客户将检查断开连接并在需要时重新连接:)

标签: python sockets timeout


【解决方案1】:

socket.settimeout

来自文档:

socket.settimeout(value)
设置阻塞套接字操作的超时。 value 参数可以是表示秒数的非负浮点数,也可以是 None。如果给定一个浮点数,如果在操作完成之前超时时间值已经过去,则后续套接字操作将引发超时异常。将超时设置为 None 会禁用套接字操作的超时。 s.settimeout(0.0) 等价于 s.setblocking(0); s.settimeout(None) 等价于 s.setblocking(1)。

因此,如果您不调用 settimeout,您的连接将保持打开状态,直到您或其他主机关闭它。而且,当然,没有任何问题会像中间主机因任何其他故障而停机。 然后,您必须监控您的连接并在断开时重新打开。

【讨论】:

    【解决方案2】:

    您可以使用 TCP KEEPALIVE 选项保持连接打开。请参阅 (linux howto)[http://www.tldp.org/HOWTO/html_single/TCP-Keepalive-HOWTO/#overview].我不确定 Windows 中的详细信息。它足够复杂,阅读文档比这里的示例要好。 Keepalive 在 Linux 内核上默认是禁用的,这可以让您很好地了解它的流行程度(阅读:不是很受欢迎)。正如其他人所建议的那样,优雅地处理断开连接甚至将 ping 数据包添加到您的协议是其他选择。

    【讨论】:

      猜你喜欢
      • 2015-12-07
      • 2016-02-14
      • 1970-01-01
      • 2011-08-30
      • 2010-09-10
      • 1970-01-01
      • 2022-11-05
      • 2014-10-09
      • 1970-01-01
      相关资源
      最近更新 更多