Python中的非阻塞套接字?

Python中的非阻塞套接字?,python,sockets,Python,Sockets,是我,还是我找不到关于python中非阻塞套接字的好教程 我不知道如何正确使用.recv和.send。根据python文档,(至少我对它的理解,recv'ed或send'ed数据可能只是部分数据。那么这是否意味着我必须在recv时以某种方式连接数据,并确保所有数据都在send中发送。如果是,怎么做?请举个例子。将要发送的字节保留在缓冲区中。(字节字符串列表最好,因为不必连接它们。)使用fcntl.fcntl函数将套接字设置为非阻塞模式: import fcntl, os fcntl.fcntl(

是我,还是我找不到关于python中非阻塞套接字的好教程


我不知道如何正确使用
.recv
.send
。根据python文档,(至少我对它的理解,
recv
'ed或
send
'ed数据可能只是部分数据。那么这是否意味着我必须在
recv
时以某种方式连接数据,并确保所有数据都在
send
中发送。如果是,怎么做?请举个例子。

将要发送的字节保留在缓冲区中。(字节字符串列表最好,因为不必连接它们。)使用
fcntl.fcntl
函数将套接字设置为非阻塞模式:

import fcntl, os
fcntl.fcntl(mysocket, fcntl.F_SETFL, os.O_NONBLOCK)
然后选择。选择将告诉您何时可以读取和写入套接字。(在非阻塞模式下写入时,将出现
EAGAIN
错误。)写入时,检查返回值以查看实际写入的字节数。从缓冲区中删除这么多字节。如果使用字符串列表方法,每次只需尝试写入第一个字符串


如果读取空字符串,则表示套接字已关闭。

套接字是否处于非阻塞模式并不重要,recv/send的工作原理基本相同;唯一的区别是非阻塞套接字抛出“资源暂时不可用”错误,而不是等待数据/套接字

recv方法返回接收的字节数,该字节数被告知小于或等于传递的bufsize。如果您希望接收精确大小的字节,则应执行类似于以下代码的操作:

def recvall(sock, size):
  data = ''
  while len(data) < size:
    d = sock.recv(size - len(data))
    if not d:
      # Connection closed by remote host, do what best for you
      return None
    data += d
  return data
def sendall(sock, data):
  while data:
    sent = sock.send(data)
    data = data[sent:]
您可以直接使用sock.sendall,但是(根据文档)在出现错误时会引发异常,并且无法确定成功发送了多少数据(如果有的话)


Python中的套接字遵循BSD套接字API,其行为方式与c样式的套接字类似(例如,区别在于它们抛出异常而不是返回错误代码)。您应该对web和手册页上的任何套接字教程感到满意。

您可能想区分send()和sendall()。此外,您可能还想使用一些高级异步IO框架,如Eventlet:感谢您接受@ultimatebuster,我刚刚意识到
recvall
中的错误处理不太好,并添加了
if not d
来处理关闭的连接。“Y ru也可以这样做!!!”还不如什么都不做,因为一切都是一样的“工作原理相同”还有。