通过测试,我得出结论,在以下三种情况下 socket.recv(recv_size)
将返回。
连接关闭后。例如客户端 调用 socket.close() 或发生任何套接字错误,它将返回 空字符串。
有些数据来了,数据大小超过
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 的官方描述?
最佳答案
是的,你的结论是正确的。 socket.recv
是一个阻塞调用。
socket.recv(1024)
最多读取 1024 个字节,如果没有数据等待读取则阻塞。如果您没有读取所有数据,则对 socket.recv
的其他调用不会阻塞。
socket.recv
如果连接关闭或出现错误,也会以空字符串结尾。
如果你想要一个非阻塞套接字,你可以使用 select 模块(比只使用套接字复杂一点)或者你可以使用 socket.setblocking
。
我过去曾遇到过 socket.setblocking
的问题,但如果您愿意,请随时尝试。
关于python - socket.recv(recv_size) 什么时候返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7174927/