如何刷新Python套接字?

2024-09-25 02:33:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Python编写了一个服务器,它将数据以“Header:Message”的形式发送给客户机

我希望能够单独发送每条消息,这样客户端将需要执行最少的工作来读取“头”和“消息”

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

示例:

服务器发送。。。

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

客户端接收。。。 “头1:message1header2:message2header3:message3”

我想收到三条个人信息

header1:message1
header2:message2
header3:message3

每次发送后我都需要一个刷新的方法


Tags: 数据服务器send消息客户端messagesocket形式
3条回答

我猜你是在讨论TCP连接。

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

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

澄清:

刷新发送缓冲区通常会创建新包,正如您所期望的那样。如果你的客户读这些包足够快,你可能会得到一个消息每次读取。

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

只要在每条消息后附加\n。。。 就像

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

你要做的是把你的数据分成“批”。

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

这三种方法是组织字节流的最基本方法,不管是哪种介质:

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

它们可以混合和/或修改。例如,您可以使用“可变记录分隔符”,如XML读取器:从第一个“<;”到第一个“>;”读取字节,在第一个“<;”之后添加斜线并将其称为记录结束,从记录结束读取流。这只是一个粗略的描述。

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

相关问题 更多 >