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