如何在建设银行网站查验回单,陶瓷网站建设中企动力,宝塔window怎么做网站,广州市城乡和建设局网站首页前言本文翻译自python3.7官方文档——asyncio-stream,译者马鸣谦,邮箱 1612557569qq.com。转载请注明出处。数据流(Streams)数据流(Streams)是用于处理网络连接的高阶异步/等待就绪(async/await-ready)原语,可以在不使用回调和底层传输协议的情况下发送和接收数据。以下是一个用…前言本文翻译自python3.7官方文档——asyncio-stream,译者马鸣谦,邮箱 1612557569qq.com。转载请注明出处。数据流(Streams)数据流(Streams)是用于处理网络连接的高阶异步/等待就绪(async/await-ready)原语,可以在不使用回调和底层传输协议的情况下发送和接收数据。以下是一个用asyncio实现的TCP回显客户端import asyncioasync def tcp_echo_client(message):reader, writer await asyncio.open_connection(127.0.0.1, 8888)print(fSend: {message!r})writer.write(message.encode())data await reader.read(100)print(fReceived: {data.decode()!r})print(Close the connection)writer.close()await writer.wait_closed()asyncio.run(tcp_echo_client(Hello World!))完整代码见例子一节。Stream方法以下所列的高层asyncio方法可以被用作创建和处理Streamcoroutine asyncio.open_connection(hostNone,*,loopNone,limitNone,sslNone,family0,proto0,flags0,sockNone,local_addrNone,server_hostnameNone,ssl_handshake_timeoutNone)创建一个网络连接并返回一对(reader,writer)对象。返回的reader和writer对象是StreamReader和StreamWriter类的实例。loop是可选参数在此方法被某个协程await时能够自动确定。limit限定返回的StreamReader实例使用的缓冲区大小。默认情况下缓冲区限制为64KiB。其余的参数被直接传递给loop.create_connection()。python3.7新增ssl_handshake_timeout参数。coroutine asyncio.start_server(client_connected_cb,hostNone,portNone,*,loopNone,limitNone,familysocket.AF_UNSPEC,flagssocket.AI_PASSIVE,sockNone,backlog100,sslNone,reuse_addressNone,reuse_portNone,ssl_handshake_timeoutNone,start_servingTrue)启动一个socket服务端。client_connected_cb指定的回调函数在新连接建立的时候被调用。该回调函数接收StreamReader和StreamWriter类的‘实例对’(reader,writer)作为两个参数。client_connected_cb可以是普通的可调用函数也可以是协程函数。如果是协程函数那么会被自动封装为Task对象处理。loop是可选参数在此方法被某个协程await时能够自动确定。limit限定返回的StreamReader实例使用的缓冲区大小。默认情况下缓冲区限定值为64KiB。其余的参数被直接传递给loop.create_server()。python3.7新增ssl_handshake_timeout和start_serving参数。Unix Socketscoroutine asyncio.open_unix_connection(pathNone,*,loopNone,limitNone,sslNone,sockNone,server_hostnameNone,ssl_handshake_timeoutNone)创建一个Unix socket连接并返回一对(reader,writer)对象。与open_connection类似只是运行在Unix sockets上。可用于Unixpython3.7新增ssl_handshake_timeout参数。python3.7修正path参数可以为类path(path-like)对象coroutine *asyncio.start_unix_server(client_connected_cb, pathNone, , loopNone, limitNone, sockNone, backlog100, sslNone, ssl_handshake_timeoutNone, start_servingTrue)启动一个Unix socket 服务端。类似于start_server,只是运行在Unix sockets上。可用于Unixpython3.7新增ssl_handshake_timeout参数。python3.7修正path参数可以为类path(path-like)对象StreamReaderclass asyncio.StreamReader定义一个读取器对象提供从IO数据流中读取数据的API。不建议 直接实例化StreamReader对象。建议通过open_connection()或start_server()创建此类对象。coroutine read(n-1)最多读取n字节数据。如果n未设置或被设置为-1则读取至EOF标志并返回读到的所有字节。如果在缓冲区仍为空时遇到EOF则返回一个空的bytes对象。coroutine readline()读取一行(以\n为标志)。如果在找到\n之前遇到EOF则返回已读取到的数据段。如果遇到EOF时内部缓冲区仍为空则返回空的bytes对象。coroutine readexactly(n)精确读取n字节数据。如果在尚未读够n字节时遇到EOF则引发IncompleteReadError异常。已经读取的部分数据可以通过IncompleteReadError.partial属性获取。coroutine readuntil(separatorb\n)从数据流中读取数据直到遇到separator。如果执行成功读到的数据和分隔符将从内部缓冲区里移除。返回的数据会在末尾包含分隔符。如果读取数据的总量超过了配置的数据流缓冲区限制则引发LimitOverrunError,数据会被留在内部缓冲区中可以被再次读取。如果在找到separator分隔符之前遇到EOF则引发IncompleteReadError异常内部缓冲区会被重置。IncompleteReadError.partial属性会包含部分separator。python3.5.2新增。at_eof()如果缓冲区为空且feed_eof()被调用则返回True。StreamWriterclass asyncio.StreamWriter定义一个写入器对象提供向IO数据流中写入数据的API。不建议直接实例化StreamWriter对象建议通过open_connection或start_server实例化对象。can_writer_eof()如果下层传输支持write_eof方法则返回True,否则返回False。write_eof()在缓冲的写入数据被刷新后关闭数据流的写入端。transport返回下层的asyncio传输。get_extra_info(name,defaultNone)访问可选的传输信息。write(data)向数据流中写入数据。此方法不受流量控制的影响。write()应同drain()一同使用。writelines()向数据流中写入bytes列表(或任何的可迭代对象)。此方法不受流量控制的影响。应与drain()一同使用。coroutine drain()等待恢复数据写入的时机。例如writer.write(data)await writer.drain()这是一个与底层IO输入缓冲区交互的流量控制方法。当缓冲区达到上限时drain()阻塞待到缓冲区回落到下限时写操作可以被恢复。当不需要等待时drain()会立即返回。close()关闭数据流。is_closing()如果数据流已经关闭或正在关闭则返回True。coroutine wait_closed()保持等待直到数据流关闭。保持等待直到底层连接被关闭应该在close()后调用此方法。Python3.7新增。示例利用Stream实现TCP回显客户端import asyncioasync def tcp_echo_client(message):reader, writer await asyncio.open_connection(127.0.0.1, 8888)print(fSend: {message!r})writer.write(message.encode())data await reader.read(100)print(fReceived: {data.decode()!r})print(Close the connection)writer.close()asyncio.run(tcp_echo_client(Hello World!))利用Stream实现TCP回显服务端import asyncioasync def handle_echo(reader, writer):data await reader.read(100)message data.decode()addr writer.get_extra_info(peername)print(fReceived {message!r} from {addr!r})print(fSend: {message!r})writer.write(data)await writer.drain()print(Close the connection)writer.close()async def main():server await asyncio.start_server(handle_echo, 127.0.0.1, 8888)addr server.sockets[0].getsockname()print(fServing on {addr})async with server:await server.serve_forever()asyncio.run(main())获取HTTP头import asyncioimport urllib.parseimport sysasync def print_http_headers(url):url urllib.parse.urlsplit(url)if url.scheme https:reader, writer await asyncio.open_connection(url.hostname, 443, sslTrue)else:reader, writer await asyncio.open_connection(url.hostname, 80)query (fHEAD {url.path or /} HTTP/1.0\r\nfHost: {url.hostname}\r\nf\r\n)writer.write(query.encode(latin-1))while True:line await reader.readline()if not line:breakline line.decode(latin1).rstrip()if line:print(fHTTP header {line})# Ignore the body, close the socketwriter.close()url sys.argv[1]asyncio.run(print_http_headers(url))用法python example.py http://example.com/path/page.html或python example.py https://example.com/path/page.html利用Stream注册等待数据的开放socketimport asyncioimport socketasync def wait_for_data():# Get a reference to the current event loop because# we want to access low-level APIs.loop asyncio.get_running_loop()# Create a pair of connected sockets.rsock, wsock socket.socketpair()# Register the open socket to wait for data.reader, writer await asyncio.open_connection(sockrsock)# Simulate the reception of data from the networkloop.call_soon(wsock.send, abc.encode())# Wait for datadata await reader.read(100)# Got data, we are done: close the socketprint(Received:, data.decode())writer.close()# Close the second socketwsock.close()asyncio.run(wait_for_data())