Python套接字,如何只接收最后一条消息而不是整个挂起的缓冲区



我有一个服务器socket,它非常频繁地发送消息(它用新数据更新同一消息(。客户端在收到消息后立即处理该信息。

我的问题是,当客户端正在处理消息时,服务器端可能已经发送了一些消息。

客户端如何只接收最后一条消息并丢弃所有挂起的包?

这是我用于客户端的代码。我制作了non-blocking,希望它能解决我的问题,但它没有,所以我不知道现在是否需要它。

import select
import socket
import time

class MyClient:
def __init__(self):
self.PORT = 5055
self.SERVER = socket.gethostbyname(socket.gethostname())
self.client = self.connect()
self.client.setblocking(False)
def connect(self):
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((self.SERVER, self.PORT))
return client

client = MyClient()
while True:
inputs = [client.client]
while inputs:
readable, writable, exceptional = select.select(inputs, [], inputs, 0.5)
for s in readable:
data = client.client.recv(2048)
print(data)
time.sleep(1)

TCP中首先没有消息的概念,这也意味着TCP不能对"最后一条消息";。相反,TCP是一个字节流。不能依赖于一侧上的单个send和另一侧上的单独recv之间的1:1关系。

只能从流中读取数据,而不能跳过数据。跳过数据必须通过读取数据并将其丢弃来完成。要获得最后一条消息,应用程序级协议必须首先定义消息的含义,然后应用程序逻辑必须读取数据,检测消息边界,然后丢弃除最后一条之外的所有消息。

最新更新