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

4
问题在于我不知道从套接字中接收到的字节数量,因此只能尝试循环。
buffer = ''

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

据我理解,recvfrom 只返回指定大小的字节并丢弃其他数据,是否有可能连续将这些数据读入缓冲变量中?


尝试使用 recv 而不是 recvfrom - Michael Aquilina
2个回答

6

这段代码不会丢失数据,它只是在下一次迭代中返回数据。你在代码中的操作是完全正确的。

唯一需要改变的是加上一个断开循环的条件:

buffer = ''

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

根据文档,空字符串表示连接已经中断。

如果这段代码仍然无法运行,则最好向我们展示您如何设置套接字。


仍然是相同的,只是前1024个。 - Kin
另外,尝试使用 recv 而不是 recvfrom - Michael Aquilina
嗯,是的,抱歉,这个问题可以通过使用“异常”和“setblocking”来解决。 - Kin

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

当你想要缓存而不关闭套接字时,这一点非常有用。

当没有数据被发送时,sock.recv(1024)将挂起,除非你在另一端关闭套接字。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接