Python: 为什么 recv() 在阻塞模式下没有阻塞?
Python: why recv() didn't block in blocking mode?
这是我的代码,客户端应该在 recv 中阻塞(它期望 256 个字符),导致服务器只向它发送 5 个字符,但是 recv return,知道吗?
#-----------------------------------------------------------
# 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()
sock.recv()
returns 因为在套接字上收到了一些东西,或者如果 len(data)
是 0,因为服务器关闭了连接。
期望256字节并不意味着它们将被一次性接收。在您的示例中,256
是 最大 字节数。
阻塞行为意味着:等到收到某些东西,而不是等到收到所有预期的东西。
如果您确定您的服务器将发送 256 个字节,您可以进行循环:
data = ''
while len(data) < 256:
data += socket.recv(256)
如果您不能一次接收到 256 个字节,这意味着您的网络可能非常不稳定(wifi?)或者服务器或您的客户端运行在缓冲区非常小的嵌入式平台上?或者服务器正在发送小块...
这是我的代码,客户端应该在 recv 中阻塞(它期望 256 个字符),导致服务器只向它发送 5 个字符,但是 recv return,知道吗?
#-----------------------------------------------------------
# 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()
sock.recv()
returns 因为在套接字上收到了一些东西,或者如果 len(data)
是 0,因为服务器关闭了连接。
期望256字节并不意味着它们将被一次性接收。在您的示例中,256
是 最大 字节数。
阻塞行为意味着:等到收到某些东西,而不是等到收到所有预期的东西。
如果您确定您的服务器将发送 256 个字节,您可以进行循环:
data = ''
while len(data) < 256:
data += socket.recv(256)
如果您不能一次接收到 256 个字节,这意味着您的网络可能非常不稳定(wifi?)或者服务器或您的客户端运行在缓冲区非常小的嵌入式平台上?或者服务器正在发送小块...