【问题标题】:Python sockets really unreliablePython套接字真的不可靠
【发布时间】:2021-09-27 20:01:12
【问题描述】:

我最近一直在尝试使用套接字进行一些编码,发现我经常遇到管道中断错误,尤其是在处理不良连接时。

为了解决这个问题,我确保在每次套接字操作后都进入睡眠状态。它有效,但速度慢且丑陋。

还有其他方法可以使套接字连接更稳定吗?

【问题讨论】:

  • 您能否详细说明您遇到了什么类型的错误,因为broken pipe error 没有对问题做出太多解释?
  • 好吧,问题基本上是服务器和客户端不同步,服务器(或客户端)收到了应该已经收到的东西。然后要么服务器和客户端都在尝试发送,要么客户端和服务器都在尝试接收。当两者都尝试发送时,“broken pipe error”是错误消息。

标签: python python-3.x sockets


【解决方案1】:

...服务器和客户端不同步

基本上你说你的应用程序是错误的。因此,使连接更稳定的方法是修复这些错误,而不是通过一些明确的睡眠来解决它。

虽然您没有显示任何代码,但“不同步”的一个常见原因是假设一侧的 send 与另一侧的 recv 完全匹配另一边。另一个常见的假设是send 将实际发送所有给定的数据,recv(n) 将准确接收n 字节的数据。

所有这些假设都是错误的。 TCP 不是基于消息的协议,而是字节流。任何消息语义都需要显式添加到此字节流之上,例如通过为消息添加长度前缀或通过具有唯一消息分隔符或通过具有固定消息大小。并且需要检查 sendrecv 的结果,以确保所有数据都已发送或已收到所有预期数据 - 如果没有更多 sendrecv 将需要完成,直到所有处理数据。

添加一些sleep 通常似乎通过添加“时间”作为消息分隔符来“修复”其中一些问题。但这并不是真正的解决方案,即它会影响性能,但也不是 100% 可靠。

【讨论】:

    【解决方案2】:

    我已经使用 Python 的 Sockets 很长时间了,我可以告诉你,只要你的代码(很遗憾你没有提供)是干净的并且本身是同步的,你就不应该遇到任何问题。我将 Sockets 用于我不一定想要/不需要编写/使用 API 的小型应用程序,它的工作原理就像一个梦想。

    正如@Steffen 在他的回答中已经提到的,TCP 不是基于消息的协议。它是一个“面向流的协议”,这意味着它是逐字节发送数据,而不是逐个消息。

    查看this 线程和paper 以更好地了解差异。

    我还建议查看this great answer 以了解如何在服务器和客户端之间同步消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-06
      • 2012-05-06
      • 2010-09-19
      • 2017-05-03
      • 1970-01-01
      • 2012-10-11
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多