socket.recv(recv_size)何时返回?

red*_*ice 42 python sockets

通过测试,我得出结论,在以下三个案例中,socket.recv(recv_size)将返回.

  1. 连接关闭后.例如,客户端调用socket.close()或发生任何套接字错误,它将返回空字符串.

  2. 有些数据来了,数据的大小超过了recv_size.

  3. 一些数据来了,数据的大小小于,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过去遇到过问题,但如果你愿意,可以随意尝试.

  • 如果为它给出正确的标志,你也可以调用recv()作为非阻塞:`socket.recv(10240,0x40)#0x40 = MSG_DONTWAIT又名O_NONBLOCK`请注意你必须抓住`[Errno 11]资源暂时不可用`没有输入数据时的例外情况. (3认同)