当前位置: 首页 > 面试题库 >

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

宰父霖
2023-03-14
问题内容

在需要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)