如何在Python中持续读取套接字数据?

4 投票
2 回答
21054 浏览
提问于 2025-04-18 02:39

问题是我不知道从套接字会收到多少字节的数据,所以我只是尝试循环读取。

buffer = ''

while True:
    data, addr = sock.recvfrom(1024)
    buffer += data
    print buffer

我理解的是,recvfrom 只会返回指定大小的字节,并且会丢弃其他的数据,那有没有办法可以不断地将这些数据读入一个缓冲区变量呢?

2 个回答

4

我建议使用readline作为缓冲区,并用"\n"来分隔每一行:

#read one line from the socket
def buffered_readLine(socket):
    line = ""
    while True:
        part = socket.recv(1)
        if part != "\n":
            line+=part
        elif part == "\n":
            break
    return line

这样做在你想要保持连接而不关闭socket的时候特别有用。

如果没有数据发送,sock.recv(1024)会一直等待,除非你在另一端关闭了socket。

6

它不会丢弃数据,只是会在下一次循环中返回这些数据。你在代码中做的事情是完全正确的。

我唯一想改变的是加一个条件来结束循环:

buffer = ''

while True:
    data, addr = sock.recv(1024)
    if data:
        buffer += data
        print buffer
    else:
        break

一个空字符串表示连接已经断开,这一点在文档中有说明。

如果这段代码还是不工作,那就最好给我们看看你是怎么设置你的套接字的。

撰写回答