From test, I concluded that in following three cases the socket.recv(recv_size) will return.
-
After the connection was closed. For example, the client side
called socket.close() or any socket error occurred, it would return
empty string. -
Some data come, the size of data is more than
recv_size. - Some data come, the size of data is less than
recv_sizeand no more data come after a short time (I found 0.1s would work).
More details about #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)
When I run client1.py, the server.py echos:
12345aaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaa EOF
When I run client2.py, the server.py echos:
12345 EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
Are my conclusions correct? Where can I see the official description about #3?
Yes, your conclusion is correct.
socket.recvis a blocking call.socket.recv(1024)will read at most 1024 bytes, blocking if no data is waiting to be read. If you don’t read all data, an other call tosocket.recvwon’t block.socket.recvwill also end with an empty string if the connection is closed or there is an error.If you want a non-blocking socket, you can use the select module (a bit more complicated than just using sockets) or you can use
socket.setblocking.I had issues with
socket.setblockingin the past, but feel free to try it if you want.