python - socket.recv(recv_size) 什么时候返回?

标签 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)

当我运行 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/

相关文章:

python - 通过对像素求和来重新调整矩阵

Php 套接字、Apache 和 CentOS 6.3 给出权限被拒绝

java - 如何在套接字io中使用用户名获取用户ID

python - 实现 TD-Gammon 算法

Python 语法 : with_stmt

python - numpy 仅对非零部分执行函数,同时保留数组结构

python - python多个客户端聊天不起作用

Java/线程优先级

sockets - libuv 如何在对等方(linux)重置连接时忽略 SIGPIPE

Java聊天服务器