【发布时间】:2021-08-21 19:47:18
【问题描述】:
我从一个未事先指定数据长度的源 (Twitch IRC) 接收数据,并且它从未发送一致数量的数据。这个源使用“\r\n”作为它的分隔符,我想接收数据,直到找到这个分隔符,停止接收处理接收到的数据,然后继续接收。我尝试了一些我想出的解决方案:
delimiter = "\r\n"
buffer = ""
while True:
received = socket.recv(1).decode("utf-8", "ignore")
buffer += received
if buffer.endswith(delimiter):
process_data(buffer)
buffer = ""
这个解决方案并不理想,因为“received”在只接收一个字节时通常是一个空字符串,这会在我的应用程序中触发一个错误处理程序(因为 Python 在 recv 期间连接断开时不会引发异常( ) 调用,它只是返回一个空字符串)。
delimiter = "\r\n"
buffer = ""
while True:
received = socket.recv(2048).decode("utf-8", "ignore")
received_messages = received.split(delimiter)
for i in received_messages[:-1]:
process_data(data)
这也不是一个好的解决方案,因为 split() 删除了分隔符,这导致我无法知道列表中的最后一个元素是否是完整的消息。
在 Python TCP 套接字中找到分隔符之前接收数据的最佳方式是什么?我正在寻找的功能类似于 Boost 的boost::asio::read_until()。
【问题讨论】: