通过测试,我得出结论,在接下来的三种情况下,socket.recv(recv_size)将返回。
recv_size还要大。recv_size,在短时间内没有更多的数据(我发现0.1s可以工作)。关于#3的更多细节:
#server.py
while True:
data = sock.recv(10)
print data, 'EOF'
#client1.py
sock.sendall("12345")
sock.sendall("a" * 50)
#client2.py
sock.sendall("12345")
time.sleep(0.1)
sock.sendall("a" * 50)当我运行client1.py时,server.py回显如下:
12345aaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaa EOF当我运行client2.py时,server.py回显如下:
12345 EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF我的结论正确吗?我在哪里能看到关于#3的官方描述?
发布于 2011-08-24 18:49:01
是的,你的结论是正确的。socket.recv是一个阻塞呼叫。
socket.recv(1024)最多读取1024字节,如果没有等待读取的数据,则会阻塞。如果不读取所有数据,则对socket.recv的其他调用不会阻塞。
如果连接关闭或出现错误,socket.recv也将以空字符串结尾。
如果您想要一个非阻塞的套接字,您可以使用select模块(比仅仅使用套接字要复杂一些),或者可以使用socket.setblocking。
过去我和socket.setblocking有过问题,但是如果你愿意的话,可以随意尝试一下。
发布于 2011-08-24 18:34:40
它将具有与底层recv调用相同的行为--参见手册页获得行为的官方描述(或阅读更多的套接字api的一般描述 )。
发布于 2019-04-05 02:53:59
我认为你的结论是正确的,但不准确。
正如文档所指出的,socket.recv主要集中在网络缓冲区上。
当套接字被阻塞时,只要网络缓冲区有字节,socket.recv就会返回。如果网络缓冲区中的字节超过socket.recv所能处理的字节数,它将返回它能够处理的最大字节数。如果网络缓冲区中的字节少于socket.recv所能处理的字节,它将返回网络缓冲区中的所有字节。
https://stackoverflow.com/questions/7174927
复制相似问题