【问题标题】:Python: why recv() didn't block in blocking mode?Python:为什么 recv() 在阻塞模式下没有阻塞?
【发布时间】:2017-07-30 11:00:47
【问题描述】:

这是我的代码,客户端应该在 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()

【问题讨论】:

    标签: python sockets blocking recv


    【解决方案1】:

    sock.recv() 返回是因为在套接字上收到了一些东西,或者如果 len(data) 为 0,因为服务器关闭了连接。

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

    阻塞行为的意思是:等到收到东西,而不是等到收到所有预期的东西。

    如果你确定你的服务器会发送 256 个字节,你可以做一个循环:

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

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

    【讨论】:

      猜你喜欢
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-11
      • 2012-10-31
      相关资源
      最近更新 更多