Ped*_*ito 1 python sockets tcp python-2.7 python-3.x
在需要var data以换行符结尾的情况下,处理套接字连接的最佳方法是什么\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 = ""
Run Code Online (Sandbox Code Playgroud)
“ 正常 ”的示例data:
line1\r\n
line2\r\n
line3\r\n
Run Code Online (Sandbox Code Playgroud)
分块的 示例data:
line1\r\n
line2\r\n
lin
Run Code Online (Sandbox Code Playgroud)
如果您有要作为行处理的原始输入,则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
Run Code Online (Sandbox Code Playgroud)
它比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()
Run Code Online (Sandbox Code Playgroud)