Python 套接字,如何只接收最后一条消息而不是整个待处理缓冲区?
Python sockets, how to receive only last message instead of the whole pending buffer?
我有一个 server 端 socket
发送消息非常频繁(它用新数据更新同一条消息)。 客户端端在收到消息后立即处理该信息。
我的问题是,当 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 关系。
只能从流中读取数据,不能跳过数据。跳过数据必须通过读取数据并将其丢弃来完成。要获取最后一条消息,应用程序级协议必须首先定义消息的含义,然后应用程序逻辑必须读取数据、检测消息边界,然后丢弃除最后一条消息之外的所有消息。
我有一个 server 端 socket
发送消息非常频繁(它用新数据更新同一条消息)。 客户端端在收到消息后立即处理该信息。
我的问题是,当 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 关系。
只能从流中读取数据,不能跳过数据。跳过数据必须通过读取数据并将其丢弃来完成。要获取最后一条消息,应用程序级协议必须首先定义消息的含义,然后应用程序逻辑必须读取数据、检测消息边界,然后丢弃除最后一条消息之外的所有消息。