gpt4 book ai didi

python - 处理以换行符结尾的套接字数据

转载 作者:可可西里 更新时间:2023-11-01 02:45:09 25 4
gpt4 key购买 nike

在我需要 var data 以换行符 \n 结束时处理套接字连接的最佳方法是什么?我正在使用下面的代码,但有时 tcp 数据包会被分 block ,并且需要很长时间才能匹配 data.endswith("\n")。我还尝试了其他方法,比如保存最后一行,如果它没有以 \n 结尾,并在下一个循环中将其附加到 data 。但这也不起作用,因为多个数据包被分 block 并且第一部分和第二部分不匹配。我无法控制另一端,它基本上发送以 \r\n 结尾的多行。

欢迎提出任何建议,因为我对套接字连接了解不多。

def receive_bar_updates(s):
global all_bars
data = ''
buffer_size = 4096
while True:
data += s.recv(buffer_size)
if not data.endswith("\n"):
continue
lines = data.split("\n")
lines = filter(None, lines)
for line in lines:
if line.startswith("BH") or line.startswith("BC"):
symbol = str(line.split(",")[1])
all_bars[symbol].append(line)
y = Thread(target=proccess_bars, kwargs={'symbol': symbol})
y.start()
data = ""

正常数据示例:

line1\r\n
line2\r\n
line3\r\n

分 block 数据示例:

line1\r\n
line2\r\n
lin

最佳答案

如果你有一个你想按行处理的原始输入,io 模块是你的 friend ,因为它会按行进行数据包的低级组装。

你可以使用:

class SocketIO(io.RawIOBase):
def __init__(self, sock):
self.sock = sock
def read(self, sz=-1):
if (sz == -1): sz=0x7FFFFFFF
return self.sock.recv(sz)
def seekable(self):
return False

它比 endswith('\n') 更健壮,因为如果一个数据包包含嵌入的换行符 ('ab\ncd'),io 模块将正确处理它。您的代码可能会变成:

def receive_bar_updates(s):
global all_bars
data = ''
buffer_size = 4096
fd = SocketIO(s) # fd can be used as an input file object

for line in fd:
if should_be_rejected_by_filter(line): continue # do not know what filter does...
if line.startswith("BH") or line.startswith("BC"):
symbol = str(line.split(",")[1])
all_bars[symbol].append(line)
y = Thread(target=proccess_bars, kwargs={'symbol': symbol})
y.start()

关于python - 处理以换行符结尾的套接字数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42987650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com