处理以换行符结尾的套接字数据
在需要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
-
如果您有要作为行处理的原始输入,则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()