Python 套接字,如何只接收最后一条消息而不是整个待处理缓冲区?

Python sockets, how to receive only last message instead of the whole pending buffer?

我有一个 serversocket 发送消息非常频繁(它用新数据更新同一条消息)。 客户端端在收到消息后立即处理该信息。

我的问题是,当 client 正在处理消息时,server 端可能已经发送了一些消息。

客户端怎么可能只收到最后一条消息并丢弃所有待处理的包?

这是我在 客户端 端使用的代码。我做到了 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 关系。

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