在需要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()
问题内容: 我有一个包含一些文本后跟空白行的字符串。保留文本内容并从末尾删除空白换行符的最佳方法是什么? 问题答案: 使用方法从字符串的开头和结尾去除空格(空格,换行等)。
问题内容: 我想使用正则表达式从字符串中删除一些符号,例如: (发生在行的开头和结尾), (仅在一行的开头)。 我的代码有什么问题?看来表达是错误的。如果字符/符号出现在行的开头或结尾(出现一次或多次),如何删除? 问题答案: 如果只想从开头和结尾删除字符,则可以使用该方法。这将给出如下代码: 该方法从字符串的开头和结尾删除参数中给定的字符,仅从开头删除它们,仅从结尾删除它们。 如果您真的想使用正
问题内容: 我正在解决一个简单的问题: 在Java中删除字符数组中的某些字符,想法很简单: 我想输入一个信号,表示当我们想要使用例如生成一个字符串时,不必考虑数组的其余部分 Java中是否有这样的字符?(我想是,但我不确定) 例如,当我们调用: 这将被打印: 虽然我想得到,但我不想使用新的数组来做到这一点 问题答案: Java不会像C那样“标记”字符串的结尾。它跟踪长度和值,因此字符串中可以包含零
问题内容: 我必须采用以下形式的大量单词: 然后使用strip功能,将其转换为: 我以为我写的东西行得通,但是我不断收到错误消息: “’list’对象没有属性’strip’” 这是我尝试的代码: 问题答案:
我试图编写套接字错误处理(确切地说是错误111-连接拒绝),但什么也没有发生。终端打印错误号111发生,但它没有做任何事情: Traceback(最近的调用为last):文件“test.py”,第20行,在s.connect((IP,PORT))中文件“/usr/lib/python2.7/socket.py”,第224行,在meth返回getattr(self._sock,name)(*args
问题内容: 当我使用vim和其他编辑器编辑源文件时,有时在该行的末尾,我在每行的末尾获得了这些^ M字符。我认为这与在Windows中然后在Linux中编辑文件有关。如何自动删除所有这些? 问题答案: 作为命令,键入 (要获取^ M,请按^ V ^ M,其中^是大多数键盘上的CTRL)