【问题标题】:How do you flush Python sockets?你如何刷新 Python 套接字?
【发布时间】:2010-12-11 22:49:24
【问题描述】:

我用 Python 编写了一个服务器,旨在以“Header:Message”的形式向客户端发送数据

我希望能够单独发送每条消息,以便客户端只需执行最少的工作即可读取“标头”和“消息”

不幸的是,我不知道如何正确刷新 python 套接字,因此当我快速连续执行多个发送时,消息会集中在套接字缓冲区中并作为一大块发送。

例子:

服务器发送...

socket.send ("header1:message1")
socket.send ("header2:message2")
socket.send ("header3:message3")

客户收到... "header1:message1header2:message2header3:message3"

我想收到三个单独的消息

header1:message1
header2:message2
header3:message3

我需要一种在每次发送后刷新的方法

【问题讨论】:

  • 不重复: 标题字面上是重复的,但问题实际上功能不同。 OP 需要一个答案,就像下面的 @ebo 一样。
  • 糟糕,这似乎是正确的。下次会尝试慢一点;-)

标签: python sockets flush


【解决方案1】:

我猜你是在通过 TCP 连接交谈。

你的方法有缺陷。 TCP 流被定义为字节流。您总是必须使用某种分隔符,并且可能不依赖网络堆栈来分隔您的消息。

如果您真的需要基于数据报的服务,请切换到 UDP。在这种情况下,您需要自己处理重传。

澄清一下:

正如您所料,刷新发送缓冲区通常会创建新的包。如果您的客户阅读这些包的速度足够快,您每次阅读可能会收到一条消息。

现在假设您通过卫星链路进行通信。由于高带宽和延迟,sat 之前的最后一个路由器会等待很短的时间,直到缓冲区中有足够的数据并一次发送所有数据包。您的客户端现在将立即接收所有数据包,并将所有数据立即放入接收缓冲区。所以你们的分离又消失了。

【讨论】:

  • +1:为了教育起见,我要补充一点,即使@Jah 要刷新套接字,他的客户端仍然会以完全相同的方式接收消息——刷新是关于清除减少延迟的名称,并且划分消息。
  • +1:TCP 是一个流。 Internet 路由和 TCP 协议专门消除了 TCP 数据的时序。数据必须被缓冲; “冲洗”实际上并不意味着什么。这意味着您的数据已超出应用程序的缓冲区并进入 TCP 协议缓冲区。
【解决方案2】:

您正在尝试做的是将您的数据分成“批次”。

例如,每当您从文件中读取“行”时,您就是在“批量”操作。什么定义了“线”?它是一个以“\n”结尾的字节序列。另一个例子是:你从一个文件中读取了 64KiB“块”。什么定义了“块”?你这样做了,因为你每次读取 65536 个字节。你想要一个可变长度的“块”吗?您只需在“块”前面加上它的大小,然后阅读“块”。 “aiff”文件(其实现也是MS Windows的.wav和.avi文件)和“mov”文件是这样组织的。

这三种方法是组织字节流的最基本方法,无论是何种介质:

  1. 记录分隔符
  2. 固定大小的记录
  3. 以大小为前缀的记录。

它们可以混合和/或修改。例如,您可以使用“可变记录分隔符”,例如 XML 阅读器:从第一个 '' 读取字节,在第一个 '

选择一种方法,并在编写器和读取器中实现它。如果您还记录了您的选择,那么您刚刚定义了您的第一个协议。

【讨论】:

    【解决方案3】:

    只需在每条消息后附加\n... 喜欢

    socket.send ("header1:message1\n")
    socket.send ("header2:message2\n")
    socket.send ("header3:message3\n")
    

    【讨论】:

    • "\n" 不保证消息是分开的。
    • 这个答案仍然是错误的,我不敢相信现在没有人编辑或删除它:\n 只在每条消息的末尾添加一个新行。它不会“刷新”套接字。所有消息仍将位于同一数据流中。它看起来就像 3 条单独的消息,因为当您打印它们时,\n 在末尾添加了一个新行。
    猜你喜欢
    • 2011-05-23
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多