通过测试,我得出结论,在以下三个案例中,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)
Run Code Online (Sandbox Code Playgroud)
我跑的时候client1.py
,server.py
回声:
12345aaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaa EOF
Run Code Online (Sandbox Code Playgroud)
我跑的时候client2.py
,server.py
回声:
12345 EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
Run Code Online (Sandbox Code Playgroud)
我的结论是否正确?我在哪里可以看到关于#3的官方描述?
Mar*_*tin 22
是的,你的结论是正确的.socket.recv
是一个阻止电话.
socket.recv(1024)
将读取最多1024个字节,如果没有数据等待读取则阻塞.如果您没有读取所有数据,则其他调用socket.recv
不会阻止.
socket.recv
如果连接关闭或出现错误,也将以空字符串结束.
如果你想要一个非阻塞套接字,你可以使用select模块(比使用套接字更复杂)或者你可以使用socket.setblocking
.
我socket.setblocking
过去遇到过问题,但如果你愿意,可以随意尝试.