asyncio-传输和协议
打开网络连接
- coroutine loop.create_connection(protocol_factory, host=None, port=None, *,ssl=None, family=0, proto=0, flags=0, sock=None, local_addr=None, server_hostname=None, ssl_handshake_timeout=None, happy_eyeballs_delay=None, interleave=None)
- 打开一个TCP连接, 连接创建成功返回(transport, protocol)
- protocol_factory必须市一个返回asyncio协议实现的可调用对象
-
- 首先创建连接并为其创建一个传输transport
-
- 不带参数的调用protocol_factory并预期返回一个协议protocol实例
-
- 协议实例用途调用其connection_made()方法与传输进行配对
-
- 成功时返回一个(transport, protocol)元组
- 创建的传输是一个具体实现的相关的双向流。
- coroutine loop.create_datagram_endpoint(protocol_factory, local_addr=None, remote_addr=None, *, family=0, proto=0, flags=0, reuse_address=None, reuse_port=None, allow_boradcast=None, sock=None)
- 创建一个数据报UDP连接
- local_addr是一个(localhost, local_port)元组
- remote_addr :(reomte_host, remote_port)元组
- coroutine loop.create_unix_connection(protocol_factory, path=None, *, ssl=None, sock=None, server_hostname=None,ssl_handshake_timeout=None)
- 创建Unix连接
- path是所要求的Unix域套接字的名字
创建网络服务
-
coroutine loop.create_server(protocol_factory, host=None, port=None, *, family=socket.AF_UNSPEC, flags=socket.AI_PASSIVE, sock=None, blocklog=100, ssl=None, reuse_address=None, reuse_port=None, ssl_handshake_timeout=NOne, start_serving=True)
创建TCP服务,返回一个Server对象。- family可以设为socket.AF_INET或socket.AF_INTE6以强制此套接字使用IPV4或IPV6
- backlog是传递给listen()的最大排队连接的数量默认100
- start_serving默认为True,表示server立即开始接收连接。如果为False,需要调用Server.start_serving()或Server.serve_forever()后才可开始接收连接。
-
coroutine loop.create_unix_server(protocol_factory, path=None, *, sock=None, backlog=100, ssl=None, ssl_handshake_timeout=None, start_serving=True)
-
coroutine loop.connect_accepted_socket(protocol_factory, socke, *, ssl=None, ssl_handshake_timeout=None)
- 把已被接收的连接包装成一个传输/协议对
- 可以被服务器用来接受asyncio以为的连接,但是使用asyncio来处理。
- sock是有socket.accept返回的套接字对象
- ssl 可被设置为一个SSLContext以再接受的连接上启用SSL
传输文件
coroutine loop.sendfile(transport, file, offset=0, count=NOne, *, fallback=True)
- 通过transport传输file,返回所发送的字节数。
TLS升级
coroutine loop.start_tls(transport, protocol, sslcontext, *, server_side=False, server_hostname=None, ssl_handshake_timeout=None)
将现有基于传输的连接升级到TLS
Server对象
class asyncio.Server
Server对象是异步上下文管理器,可以使用async with语句
- close():停止服务,关闭监听的套接字并且设置sockets属性为None,服务器是被异步关闭的,使用wait_closed协程来等待服务器关闭
- get_loop()
- coroutine start_serving():该方法幂等
- coroutine serve_forever()
- is_serving()
- coroutine wait_closed()
- sockets: 服务器监听的socket.socket对象列表。3.7之后返回的是该列表的副本。
传输Transport
传输对象总是由异步IO事件循环实例化
传输层级
- asyncio.BaseTransport: 所有传输的基类
- asyncio.WriteTransport: 只写连接的基础传输
- asyncio.ReadTransport: 只读
- asyncio.Transport(WriteTransport, ReadTransport): 双向传输,如TCP连接
- asyncio.DatagramTransport(BaseTransport): 数据保UDP传输连接
- asyncio.SubprocessTransport(BaseTransport): 父进程和子进程之间的连接的抽象
BaseTransport
- BaseTransport.close()
- BaseTransport.is_closing()
- BaseTransport.get_extra_info(name, default=None)
- 获取传输或它使用的相关资源信息
- name表示要获取传输特定信息的字符串
- defautl是再信息不可用或传输不支持第三方事件循环实现或当前平台查询时返回的值
- 可查询信息:
- 套接字: 'peername': 套接字连接时的远端地址,'socket':socket.socket实例, 'sockname':套接字本地地址。
- BaseTransport.set_protocol(protocol):设置新的协议
- BaseTransport.get_protocol(): 返回当前协议
只读传输ReadTransport
- ReadTransport.is_reading():传输接收到新数据时返回True。
- ReadTransport.pause_reading(): 暂停传输的接收端,protocol.data_received()方法将不会收到数据,除非resume_reading()被调用
- ReadTransport.resume_reading(): 恢复接收端,如果有数据可读取时,协议方法protocol.data_received()经再次被调用
只写传输
- WriteTransport.abort(): 立即关闭传输,不会等到已提交的操作处理完毕,已缓存的数据将会丢失,不会立即接收更多数据。
- WriteTransport.can_write_eof(): 是否支持write_eof()
- WriteTransport.get_write_buffer_size(): 获取当前缓冲区大小
- WriteTransport.get_write_buffer_limits(): 获取写入流控制high和low高低标记位,返回元组(low,high),low,high为正字节数
- WriteTransport.set_write_buffer_limits(high=None, low=None): 设置写入流控制high和low。当缓冲区大小大于等于high时,protocol.pause_writing()方法被调用,当缓冲区大小小于等于low时protocol.resume_writing()被调用。
- WriteTransport.write(data):该方法不会则是,它会缓冲数据并安排其被异步的发出
- WriteTransport.writelines(list_of_data):将数据字节串列表或任意可迭代对象写入
- WriteTransport.write_eof():刷新所有缓冲数据之后关闭传输的写入端。
数据报传输DatagramTransport
- DatagramTransport.sendto(data, addr=None):addr为None,将数据发送到传输创建时给定的目标地址。
- DatagramTansport.abort(): 立即关闭传输
协议
asyncio提供了一组抽象基础协议类,与传输配合使用。
抽象基础协议的子类可以实现其中的部分或全部方法,所有方法都是回调,由传输或特定事件调用。
基础协议
- asyncio.BaseProtocol
- asyncio.Protocol(BaseProtocol): 流式协议(Tcp,Unix套接字)的基类
- asyncio.BufferedProtocol(BaseProtocol):用于实现可对接缓冲区进行手动控制的流式协议的基类
- asyncio.DatagramProtocol(BaseProtocol):数据报UDP协议的基类
- asyncio.SubprocessProtocol(BaseProtocol): 子进程通信(单向管道)的协议的基类
BaseProtocol
- 连接回调:连接回调会在所有协议上被调用,美国成功的连接将调用一次。所有其它协议的回调只能在一下两个方法之间被调用。
- BaseProtocol.connection_made(transport): 连接建立时被调用,transport参数时代表连接的的传输。
- BaseProtcol.connection_lost(exc): 连接丢失或关闭时将被调用。参数是一个异常对象或None。
- 流程控制回调
- BaseProtocol.pause_writing()
- BaseProtocol.resume_writing()
Protocol
- Protocol.data_received(data): 当收到数据时被调用,data为包含入站数据的非空字节串对象
- Protocol.eof_received(): 当发出信号的另一端不再继续发送数据时(通过调用transport.write_eof(),)被调用。
BufferedProtocol
BufferedProtocol实现运行显示手动分配和控制接收缓冲区
- BufferedProtocol.get_buffer(sizehint):分配新的接收缓冲区,sizehint时推荐的缓冲区大小
- BufferedProtocol.buffer_updated(nbytes): 用接收的数据更新缓冲区时被调用
- BufferedProtocol.eof_received()
DatagramProtocol
- DatagramProtocol.datagram_received(data, addr):当接收到数据报时被调用。 data 是包含传入数据的字节串对象。 addr 是发送数据的对等端地址;实际的格式取决于具体传输。
- DatagramProtocol.error_received(exc):当前发送或接收操作引发OSError时被调用,exc时OSError的实例。当传输检测到无法将数据保传给接收方等极少数情况下被调用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用