Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:为什么recv()没有';阻塞模式下的t阻塞?_Python_Sockets_Blocking_Recv - Fatal编程技术网

Python:为什么recv()没有';阻塞模式下的t阻塞?

Python:为什么recv()没有';阻塞模式下的t阻塞?,python,sockets,blocking,recv,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)) soc

这是我的代码,客户端应该在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()
sock.recv()
返回,因为在套接字上接收到某些内容,或者如果
len(data)
为0,因为服务器关闭了连接

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

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

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

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

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

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

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

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

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