Python:为什么recv()没有在阻塞模式下阻塞?

时间:2017-03-09 12:42:18

标签: python sockets blocking recv

这是我的代码,客户端应该在recv中阻塞(它期望256个字符),导致服务器只发送5个字符,但是recv返回,有什么想法吗?

#-----------------------------------------------------------
# server.py
import socket
import sys

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost', 10000))
sock.listen(1)

while True:
    connection, client_address = sock.accept()
    try:
        connection.send('hello'.encode('utf-8'))
    except Exception:
        connection.close()

#-----------------------------------------------------------
# client.py
import socket
import sys

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 10000))
sock.setblocking(True)
try:
    data = sock.recv(256)
    print('received "%s"' % data.decode('utf-8'))

finally:
    sock.close()

1 个答案:

答案 0 :(得分:2)

sock.recv()返回,因为套接字收到了某些内容,或者len(data)为0,因为服务器已关闭连接。

期望256个字节并不意味着它们将一次性接收。在您的示例中,256最大字节数。

阻止行为意味着:等到收到某些东西,不要等到收到预期的所有内容。

如果您确定您的服务器将发送256个字节,您可以进行循环:

data = ''
while len(data) < 256:
  data += socket.recv(256)

如果你不能一次接收256个字节,这意味着你的网络可能非常不稳定(wifi?)或者服务器或你的客户端运行在具有非常小的缓冲区的嵌入式平台上?或者服务器正在发送小块......