小编典典

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

python

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

正常 ”的示例data

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

分块的 示例data

line1\r\n
line2\r\n
lin

阅读 166

收藏
2021-01-20

共1个答案

小编典典

如果您有要作为行处理的原始输入,则io模块是您的朋友,因为它将在行中进行底层数据包组装。

您可以使用:

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()
2021-01-20