| 
									
										
										
										
											2014-01-23 11:05:01 +01:00
										 |  |  | .. currentmodule:: asyncio
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-02 15:03:02 +01:00
										 |  |  | .. _asyncio-streams:
 | 
					
						
							| 
									
										
										
										
											2014-01-24 17:33:20 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | =======
 | 
					
						
							|  |  |  | Streams
 | 
					
						
							|  |  |  | =======
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:05:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-10 19:18:46 -04:00
										 |  |  | **Source code:** :source:`Lib/asyncio/streams.py`
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | -------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | Streams are high-level async/await-ready primitives to work with
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  | network connections.  Streams allow sending and receiving data without
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | using callbacks or low-level protocols and transports.
 | 
					
						
							| 
									
										
										
										
											2017-07-25 17:03:51 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 15:11:24 -07:00
										 |  |  | .. _asyncio_example_stream:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  | Here is an example of a TCP echo client written using asyncio
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | streams::
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:05:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |     import asyncio
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     async def tcp_echo_client(message):
 | 
					
						
							| 
									
										
										
										
											2019-09-29 21:59:55 -07:00
										 |  |  |         reader, writer = await asyncio.open_connection(
 | 
					
						
							|  |  |  |             '127.0.0.1', 8888)
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-29 21:59:55 -07:00
										 |  |  |         print(f'Send: {message!r}')
 | 
					
						
							|  |  |  |         writer.write(message.encode())
 | 
					
						
							|  |  |  |         await writer.drain()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         data = await reader.read(100)
 | 
					
						
							|  |  |  |         print(f'Received: {data.decode()!r}')
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         print('Close the connection')
 | 
					
						
							|  |  |  |         writer.close()
 | 
					
						
							|  |  |  |         await writer.wait_closed()
 | 
					
						
							| 
									
										
										
										
											2015-10-19 13:18:04 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |     asyncio.run(tcp_echo_client('Hello World!'))
 | 
					
						
							| 
									
										
										
										
											2015-10-19 13:18:04 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  | See also the `Examples`_ section below.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. rubric:: Stream Functions
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:05:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | The following top-level asyncio functions can be used to create
 | 
					
						
							|  |  |  | and work with streams:
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:05:01 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-16 22:37:28 -03:00
										 |  |  | .. coroutinefunction:: open_connection(host=None, port=None, *, \
 | 
					
						
							| 
									
										
										
										
											2020-11-29 14:50:57 +02:00
										 |  |  |                           limit=None, ssl=None, family=0, proto=0, \
 | 
					
						
							|  |  |  |                           flags=0, sock=None, local_addr=None, \
 | 
					
						
							| 
									
										
										
										
											2022-03-13 01:54:59 +02:00
										 |  |  |                           server_hostname=None, ssl_handshake_timeout=None, \
 | 
					
						
							| 
									
										
										
										
											2022-12-14 17:57:02 +01:00
										 |  |  |                           ssl_shutdown_timeout=None, \
 | 
					
						
							| 
									
										
										
										
											2022-03-13 01:54:59 +02:00
										 |  |  |                           happy_eyeballs_delay=None, interleave=None)
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Establish a network connection and return a pair of
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    ``(reader, writer)`` objects.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |    The returned *reader* and *writer* objects are instances of
 | 
					
						
							|  |  |  |    :class:`StreamReader` and :class:`StreamWriter` classes.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    *limit* determines the buffer size limit used by the
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    returned :class:`StreamReader` instance.  By default the *limit*
 | 
					
						
							|  |  |  |    is set to 64 KiB.
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:05:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-08 11:36:00 -04:00
										 |  |  |    The rest of the arguments are passed directly to
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    :meth:`loop.create_connection`.
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:05:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-05 16:42:01 -07:00
										 |  |  |    .. note::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       The *sock* argument transfers ownership of the socket to the
 | 
					
						
							|  |  |  |       :class:`StreamWriter` created. To close the socket, call its
 | 
					
						
							|  |  |  |       :meth:`~asyncio.StreamWriter.close` method.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |    .. versionchanged:: 3.7
 | 
					
						
							|  |  |  |       Added the *ssl_handshake_timeout* parameter.
 | 
					
						
							| 
									
										
										
										
											2021-05-27 05:59:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-22 22:40:26 +01:00
										 |  |  |    .. versionchanged:: 3.8
 | 
					
						
							|  |  |  |       Added the *happy_eyeballs_delay* and *interleave* parameters.
 | 
					
						
							| 
									
										
										
										
											2022-03-13 01:54:59 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |    .. versionchanged:: 3.10
 | 
					
						
							|  |  |  |       Removed the *loop* parameter.
 | 
					
						
							| 
									
										
										
										
											2021-05-27 05:59:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-14 17:57:02 +01:00
										 |  |  |    .. versionchanged:: 3.11
 | 
					
						
							|  |  |  |       Added the *ssl_shutdown_timeout* parameter.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-27 05:59:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. coroutinefunction:: start_server(client_connected_cb, host=None, \
 | 
					
						
							| 
									
										
										
										
											2020-12-16 22:37:28 -03:00
										 |  |  |                           port=None, *, limit=None, \
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |                           family=socket.AF_UNSPEC, \
 | 
					
						
							|  |  |  |                           flags=socket.AI_PASSIVE, sock=None, \
 | 
					
						
							|  |  |  |                           backlog=100, ssl=None, reuse_address=None, \
 | 
					
						
							|  |  |  |                           reuse_port=None, ssl_handshake_timeout=None, \
 | 
					
						
							| 
									
										
										
										
											2022-12-14 17:57:02 +01:00
										 |  |  |                           ssl_shutdown_timeout=None, start_serving=True)
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:05:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Start a socket server.
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:05:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-08 11:36:00 -04:00
										 |  |  |    The *client_connected_cb* callback is called whenever a new client
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    connection is established.  It receives a ``(reader, writer)`` pair
 | 
					
						
							|  |  |  |    as two arguments, instances of the :class:`StreamReader` and
 | 
					
						
							|  |  |  |    :class:`StreamWriter` classes.
 | 
					
						
							| 
									
										
										
										
											2018-06-08 11:36:00 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    *client_connected_cb* can be a plain callable or a
 | 
					
						
							| 
									
										
										
										
											2018-06-08 11:36:00 -04:00
										 |  |  |    :ref:`coroutine function <coroutine>`; if it is a coroutine function,
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    it will be automatically scheduled as a :class:`Task`.
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:05:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    *limit* determines the buffer size limit used by the
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    returned :class:`StreamReader` instance.  By default the *limit*
 | 
					
						
							|  |  |  |    is set to 64 KiB.
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:05:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    The rest of the arguments are passed directly to
 | 
					
						
							|  |  |  |    :meth:`loop.create_server`.
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:05:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-05 16:42:01 -07:00
										 |  |  |    .. note::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       The *sock* argument transfers ownership of the socket to the
 | 
					
						
							|  |  |  |       server created. To close the socket, call the server's
 | 
					
						
							|  |  |  |       :meth:`~asyncio.Server.close` method.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |    .. versionchanged:: 3.7
 | 
					
						
							|  |  |  |       Added the *ssl_handshake_timeout* and *start_serving* parameters.
 | 
					
						
							| 
									
										
										
										
											2021-05-27 05:59:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |    .. versionchanged:: 3.10
 | 
					
						
							|  |  |  |       Removed the *loop* parameter.
 | 
					
						
							| 
									
										
										
										
											2021-05-27 05:59:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-14 17:57:02 +01:00
										 |  |  |    .. versionchanged:: 3.11
 | 
					
						
							|  |  |  |       Added the *ssl_shutdown_timeout* parameter.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. rubric:: Unix Sockets
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-16 22:37:28 -03:00
										 |  |  | .. coroutinefunction:: open_unix_connection(path=None, *, limit=None, \
 | 
					
						
							| 
									
										
										
										
											2020-11-29 14:50:57 +02:00
										 |  |  |                         ssl=None, sock=None, server_hostname=None, \
 | 
					
						
							| 
									
										
										
										
											2022-12-14 17:57:02 +01:00
										 |  |  |                         ssl_handshake_timeout=None, ssl_shutdown_timeout=None)
 | 
					
						
							| 
									
										
										
										
											2014-02-20 14:10:02 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    Establish a Unix socket connection and return a pair of
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    ``(reader, writer)``.
 | 
					
						
							| 
									
										
										
										
											2018-06-08 11:36:00 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    Similar to :func:`open_connection` but operates on Unix sockets.
 | 
					
						
							| 
									
										
										
										
											2014-02-20 14:10:02 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    See also the documentation of :meth:`loop.create_unix_connection`.
 | 
					
						
							| 
									
										
										
										
											2014-02-20 14:10:02 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-05 16:42:01 -07:00
										 |  |  |    .. note::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       The *sock* argument transfers ownership of the socket to the
 | 
					
						
							|  |  |  |       :class:`StreamWriter` created. To close the socket, call its
 | 
					
						
							|  |  |  |       :meth:`~asyncio.StreamWriter.close` method.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-12 10:55:20 -04:00
										 |  |  |    .. availability:: Unix.
 | 
					
						
							| 
									
										
										
										
											2014-02-20 14:10:02 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-08 11:36:00 -04:00
										 |  |  |    .. versionchanged:: 3.7
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |       Added the *ssl_handshake_timeout* parameter.
 | 
					
						
							| 
									
										
										
										
											2018-06-08 11:36:00 -04:00
										 |  |  |       The *path* parameter can now be a :term:`path-like object`
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |    .. versionchanged:: 3.10
 | 
					
						
							|  |  |  |       Removed the *loop* parameter.
 | 
					
						
							| 
									
										
										
										
											2021-05-27 05:59:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-28 18:34:35 +02:00
										 |  |  |    .. versionchanged:: 3.11
 | 
					
						
							|  |  |  |       Added the *ssl_shutdown_timeout* parameter.
 | 
					
						
							| 
									
										
										
										
											2022-12-14 17:57:02 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. coroutinefunction:: start_unix_server(client_connected_cb, path=None, \
 | 
					
						
							| 
									
										
										
										
											2020-12-16 22:37:28 -03:00
										 |  |  |                           *, limit=None, sock=None, backlog=100, ssl=None, \
 | 
					
						
							| 
									
										
										
										
											2022-12-14 17:57:02 +01:00
										 |  |  |                           ssl_handshake_timeout=None, \
 | 
					
						
							|  |  |  |                           ssl_shutdown_timeout=None, start_serving=True)
 | 
					
						
							| 
									
										
										
										
											2018-06-08 11:36:00 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    Start a Unix socket server.
 | 
					
						
							| 
									
										
										
										
											2018-06-08 11:36:00 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    Similar to :func:`start_server` but works with Unix sockets.
 | 
					
						
							| 
									
										
										
										
											2014-02-20 14:10:02 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    See also the documentation of :meth:`loop.create_unix_server`.
 | 
					
						
							| 
									
										
										
										
											2014-02-20 14:10:02 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-05 16:42:01 -07:00
										 |  |  |    .. note::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       The *sock* argument transfers ownership of the socket to the
 | 
					
						
							|  |  |  |       server created. To close the socket, call the server's
 | 
					
						
							|  |  |  |       :meth:`~asyncio.Server.close` method.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-12 10:55:20 -04:00
										 |  |  |    .. availability:: Unix.
 | 
					
						
							| 
									
										
										
										
											2014-02-20 14:10:02 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-08 11:36:00 -04:00
										 |  |  |    .. versionchanged:: 3.7
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |       Added the *ssl_handshake_timeout* and *start_serving* parameters.
 | 
					
						
							| 
									
										
										
										
											2018-06-08 11:36:00 -04:00
										 |  |  |       The *path* parameter can now be a :term:`path-like object`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |    .. versionchanged:: 3.10
 | 
					
						
							|  |  |  |       Removed the *loop* parameter.
 | 
					
						
							| 
									
										
										
										
											2021-05-27 05:59:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-14 17:57:02 +01:00
										 |  |  |    .. versionchanged:: 3.11
 | 
					
						
							|  |  |  |       Added the *ssl_shutdown_timeout* parameter.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:05:01 +01:00
										 |  |  | StreamReader
 | 
					
						
							|  |  |  | ============
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  | .. class:: StreamReader
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:05:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    Represents a reader object that provides APIs to read data
 | 
					
						
							| 
									
										
										
										
											2022-10-25 19:16:18 -07:00
										 |  |  |    from the IO stream. As an :term:`asynchronous iterable`, the
 | 
					
						
							|  |  |  |    object supports the :keyword:`async for` statement.
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:05:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    It is not recommended to instantiate *StreamReader* objects
 | 
					
						
							|  |  |  |    directly; use :func:`open_connection` and :func:`start_server`
 | 
					
						
							|  |  |  |    instead.
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:05:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-26 01:40:19 +02:00
										 |  |  |    .. method:: feed_eof()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Acknowledge the EOF.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-12 22:49:18 +01:00
										 |  |  |    .. coroutinemethod:: read(n=-1)
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:05:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-17 22:01:26 +01:00
										 |  |  |       Read up to *n* bytes from the stream.
 | 
					
						
							| 
									
										
										
										
											2014-02-20 14:10:02 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-17 22:01:26 +01:00
										 |  |  |       If *n* is not provided or set to ``-1``,
 | 
					
						
							|  |  |  |       read until EOF, then return all read :class:`bytes`.
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |       If EOF was received and the internal buffer is empty,
 | 
					
						
							| 
									
										
										
										
											2014-02-20 14:10:02 -05:00
										 |  |  |       return an empty ``bytes`` object.
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:05:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-17 22:01:26 +01:00
										 |  |  |       If *n* is ``0``, return an empty ``bytes`` object immediately.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       If *n* is positive, return at most *n* available ``bytes``
 | 
					
						
							|  |  |  |       as soon as at least 1 byte is available in the internal buffer.
 | 
					
						
							|  |  |  |       If EOF is received before any byte is read, return an empty
 | 
					
						
							|  |  |  |       ``bytes`` object.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-12 22:49:18 +01:00
										 |  |  |    .. coroutinemethod:: readline()
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:05:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       Read one line, where "line" is a sequence of bytes
 | 
					
						
							|  |  |  |       ending with ``\n``.
 | 
					
						
							| 
									
										
										
										
											2014-02-20 14:10:02 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |       If EOF is received and ``\n`` was not found, the method
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       returns partially read data.
 | 
					
						
							| 
									
										
										
										
											2014-02-20 14:10:02 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |       If EOF is received and the internal buffer is empty,
 | 
					
						
							| 
									
										
										
										
											2014-02-20 14:10:02 -05:00
										 |  |  |       return an empty ``bytes`` object.
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:05:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-12 22:49:18 +01:00
										 |  |  |    .. coroutinemethod:: readexactly(n)
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:05:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       Read exactly *n* bytes.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |       Raise an :exc:`IncompleteReadError` if EOF is reached before *n*
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       can be read.  Use the :attr:`IncompleteReadError.partial`
 | 
					
						
							|  |  |  |       attribute to get the partially read data.
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:05:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-21 16:04:46 +01:00
										 |  |  |    .. coroutinemethod:: readuntil(separator=b'\n')
 | 
					
						
							| 
									
										
										
										
											2016-05-16 16:23:00 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |       Read data from the stream until *separator* is found.
 | 
					
						
							| 
									
										
										
										
											2016-05-16 16:23:00 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |       On success, the data and separator will be removed from the
 | 
					
						
							|  |  |  |       internal buffer (consumed). Returned data will include the
 | 
					
						
							|  |  |  |       separator at the end.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |       If the amount of data read exceeds the configured stream limit, a
 | 
					
						
							|  |  |  |       :exc:`LimitOverrunError` exception is raised, and the data
 | 
					
						
							|  |  |  |       is left in the internal buffer and can be read again.
 | 
					
						
							| 
									
										
										
										
											2016-05-16 16:23:00 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |       If EOF is reached before the complete separator is found,
 | 
					
						
							|  |  |  |       an :exc:`IncompleteReadError` exception is raised, and the internal
 | 
					
						
							|  |  |  |       buffer is reset.  The :attr:`IncompleteReadError.partial` attribute
 | 
					
						
							|  |  |  |       may contain a portion of the separator.
 | 
					
						
							| 
									
										
										
										
											2016-05-16 16:23:00 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-11 16:41:55 +02:00
										 |  |  |       The *separator* may also be a tuple of separators. In this
 | 
					
						
							| 
									
										
										
										
											2024-04-08 18:58:02 +02:00
										 |  |  |       case the return value will be the shortest possible that has any
 | 
					
						
							|  |  |  |       separator as the suffix. For the purposes of :exc:`LimitOverrunError`,
 | 
					
						
							|  |  |  |       the shortest possible separator is considered to be the one that
 | 
					
						
							|  |  |  |       matched.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-16 16:23:00 -04:00
										 |  |  |       .. versionadded:: 3.5.2
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-08 18:58:02 +02:00
										 |  |  |       .. versionchanged:: 3.13
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-11 16:41:55 +02:00
										 |  |  |          The *separator* parameter may now be a :class:`tuple` of
 | 
					
						
							| 
									
										
										
										
											2024-04-08 18:58:02 +02:00
										 |  |  |          separators.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-20 14:10:02 -05:00
										 |  |  |    .. method:: at_eof()
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-29 21:59:55 -07:00
										 |  |  |       Return ``True`` if the buffer is empty and :meth:`feed_eof`
 | 
					
						
							|  |  |  |       was called.
 | 
					
						
							| 
									
										
										
										
											2014-02-20 14:10:02 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:05:01 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | StreamWriter
 | 
					
						
							|  |  |  | ============
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  | .. class:: StreamWriter
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:05:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    Represents a writer object that provides APIs to write data
 | 
					
						
							|  |  |  |    to the IO stream.
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:05:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    It is not recommended to instantiate *StreamWriter* objects
 | 
					
						
							|  |  |  |    directly; use :func:`open_connection` and :func:`start_server`
 | 
					
						
							|  |  |  |    instead.
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:05:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-09 15:14:58 -04:00
										 |  |  |    .. method:: write(data)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       The method attempts to write the *data* to the underlying socket immediately.
 | 
					
						
							|  |  |  |       If that fails, the data is queued in an internal write buffer until it can be
 | 
					
						
							|  |  |  |       sent.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-29 21:59:55 -07:00
										 |  |  |       The method should be used along with the ``drain()`` method::
 | 
					
						
							| 
									
										
										
										
											2019-05-09 15:14:58 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |          stream.write(data)
 | 
					
						
							|  |  |  |          await stream.drain()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. method:: writelines(data)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       The method writes a list (or any iterable) of bytes to the underlying socket
 | 
					
						
							|  |  |  |       immediately.
 | 
					
						
							|  |  |  |       If that fails, the data is queued in an internal write buffer until it can be
 | 
					
						
							|  |  |  |       sent.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-29 21:59:55 -07:00
										 |  |  |       The method should be used along with the ``drain()`` method::
 | 
					
						
							| 
									
										
										
										
											2018-09-13 16:53:49 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-09 15:14:58 -04:00
										 |  |  |          stream.writelines(lines)
 | 
					
						
							|  |  |  |          await stream.drain()
 | 
					
						
							| 
									
										
										
										
											2018-09-13 16:53:49 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-09 15:14:58 -04:00
										 |  |  |    .. method:: close()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       The method closes the stream and the underlying socket.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-03 02:18:39 -05:00
										 |  |  |       The method should be used, though not mandatory,
 | 
					
						
							|  |  |  |       along with the ``wait_closed()`` method::
 | 
					
						
							| 
									
										
										
										
											2018-09-13 16:53:49 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-09 15:14:58 -04:00
										 |  |  |          stream.close()
 | 
					
						
							|  |  |  |          await stream.wait_closed()
 | 
					
						
							| 
									
										
										
										
											2018-09-13 16:53:49 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. method:: can_write_eof()
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-12 16:57:03 +02:00
										 |  |  |       Return ``True`` if the underlying transport supports
 | 
					
						
							|  |  |  |       the :meth:`write_eof` method, ``False`` otherwise.
 | 
					
						
							| 
									
										
										
										
											2018-09-13 16:53:49 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. method:: write_eof()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Close the write end of the stream after the buffered write
 | 
					
						
							|  |  |  |       data is flushed.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. attribute:: transport
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Return the underlying asyncio transport.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. method:: get_extra_info(name, default=None)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Access optional transport information; see
 | 
					
						
							|  |  |  |       :meth:`BaseTransport.get_extra_info` for details.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    .. coroutinemethod:: drain()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Wait until it is appropriate to resume writing to the stream.
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |       Example::
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |           writer.write(data)
 | 
					
						
							|  |  |  |           await writer.drain()
 | 
					
						
							| 
									
										
										
										
											2014-02-08 22:50:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |       This is a flow control method that interacts with the underlying
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       IO write buffer.  When the size of the buffer reaches
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |       the high watermark, *drain()* blocks until the size of the
 | 
					
						
							|  |  |  |       buffer is drained down to the low watermark and writing can
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       be resumed.  When there is nothing to wait for, the :meth:`drain`
 | 
					
						
							|  |  |  |       returns immediately.
 | 
					
						
							| 
									
										
										
										
											2014-02-08 22:50:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-04 03:32:32 +08:00
										 |  |  |    .. coroutinemethod:: start_tls(sslcontext, *, server_hostname=None, \
 | 
					
						
							| 
									
										
										
										
											2023-02-01 19:03:59 +08:00
										 |  |  |                           ssl_handshake_timeout=None, ssl_shutdown_timeout=None)
 | 
					
						
							| 
									
										
										
										
											2022-04-15 15:23:14 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |       Upgrade an existing stream-based connection to TLS.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Parameters:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       * *sslcontext*: a configured instance of :class:`~ssl.SSLContext`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       * *server_hostname*: sets or overrides the host name that the target
 | 
					
						
							|  |  |  |         server's certificate will be matched against.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       * *ssl_handshake_timeout* is the time in seconds to wait for the TLS
 | 
					
						
							|  |  |  |         handshake to complete before aborting the connection.  ``60.0`` seconds
 | 
					
						
							|  |  |  |         if ``None`` (default).
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-01 19:03:59 +08:00
										 |  |  |       * *ssl_shutdown_timeout* is the time in seconds to wait for the SSL shutdown
 | 
					
						
							|  |  |  |         to complete before aborting the connection. ``30.0`` seconds if ``None``
 | 
					
						
							|  |  |  |         (default).
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-08 18:44:54 +03:00
										 |  |  |       .. versionadded:: 3.11
 | 
					
						
							| 
									
										
										
										
											2022-04-15 15:23:14 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-01 19:03:59 +08:00
										 |  |  |       .. versionchanged:: 3.12
 | 
					
						
							|  |  |  |          Added the *ssl_shutdown_timeout* parameter.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-25 00:30:30 +02:00
										 |  |  |    .. method:: is_closing()
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       Return ``True`` if the stream is closed or in the process of
 | 
					
						
							|  |  |  |       being closed.
 | 
					
						
							| 
									
										
										
										
											2018-01-25 00:30:30 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       .. versionadded:: 3.7
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. coroutinemethod:: wait_closed()
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       Wait until the stream is closed.
 | 
					
						
							| 
									
										
										
										
											2018-01-25 00:30:30 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       Should be called after :meth:`close` to wait until the underlying
 | 
					
						
							| 
									
										
										
										
											2023-02-03 02:18:39 -05:00
										 |  |  |       connection is closed, ensuring that all data has been flushed
 | 
					
						
							|  |  |  |       before e.g. exiting the program.
 | 
					
						
							| 
									
										
										
										
											2018-01-25 00:30:30 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       .. versionadded:: 3.7
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:25:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | Examples
 | 
					
						
							|  |  |  | ========
 | 
					
						
							| 
									
										
										
										
											2014-10-11 15:52:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-12 20:18:16 +02:00
										 |  |  | .. _asyncio-tcp-echo-client-streams:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TCP echo client using streams
 | 
					
						
							|  |  |  | -----------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-29 21:59:55 -07:00
										 |  |  | TCP echo client using the :func:`asyncio.open_connection` function::
 | 
					
						
							| 
									
										
										
										
											2014-10-12 20:18:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     import asyncio
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |     async def tcp_echo_client(message):
 | 
					
						
							| 
									
										
										
										
											2019-09-29 21:59:55 -07:00
										 |  |  |         reader, writer = await asyncio.open_connection(
 | 
					
						
							|  |  |  |             '127.0.0.1', 8888)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         print(f'Send: {message!r}')
 | 
					
						
							|  |  |  |         writer.write(message.encode())
 | 
					
						
							| 
									
										
										
										
											2021-11-25 20:15:24 +03:00
										 |  |  |         await writer.drain()
 | 
					
						
							| 
									
										
										
										
											2019-09-29 21:59:55 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         data = await reader.read(100)
 | 
					
						
							|  |  |  |         print(f'Received: {data.decode()!r}')
 | 
					
						
							| 
									
										
										
										
											2014-10-12 20:18:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-29 21:59:55 -07:00
										 |  |  |         print('Close the connection')
 | 
					
						
							|  |  |  |         writer.close()
 | 
					
						
							| 
									
										
										
										
											2023-02-03 02:18:39 -05:00
										 |  |  |         await writer.wait_closed()
 | 
					
						
							| 
									
										
										
										
											2014-10-12 20:18:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |     asyncio.run(tcp_echo_client('Hello World!'))
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-12 20:18:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. seealso::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 15:35:24 -04:00
										 |  |  |    The :ref:`TCP echo client protocol <asyncio_example_tcp_echo_client_protocol>`
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    example uses the low-level :meth:`loop.create_connection` method.
 | 
					
						
							| 
									
										
										
										
											2014-10-12 20:18:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. _asyncio-tcp-echo-server-streams:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TCP echo server using streams
 | 
					
						
							|  |  |  | -----------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-29 21:59:55 -07:00
										 |  |  | TCP echo server using the :func:`asyncio.start_server` function::
 | 
					
						
							| 
									
										
										
										
											2014-10-12 20:18:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     import asyncio
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-29 21:59:55 -07:00
										 |  |  |     async def handle_echo(reader, writer):
 | 
					
						
							|  |  |  |         data = await reader.read(100)
 | 
					
						
							| 
									
										
										
										
											2014-10-12 20:18:16 +02:00
										 |  |  |         message = data.decode()
 | 
					
						
							| 
									
										
										
										
											2019-09-29 21:59:55 -07:00
										 |  |  |         addr = writer.get_extra_info('peername')
 | 
					
						
							| 
									
										
										
										
											2014-10-12 20:18:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |         print(f"Received {message!r} from {addr!r}")
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         print(f"Send: {message!r}")
 | 
					
						
							| 
									
										
										
										
											2019-09-29 21:59:55 -07:00
										 |  |  |         writer.write(data)
 | 
					
						
							|  |  |  |         await writer.drain()
 | 
					
						
							| 
									
										
										
										
											2014-10-12 20:18:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |         print("Close the connection")
 | 
					
						
							| 
									
										
										
										
											2019-09-29 21:59:55 -07:00
										 |  |  |         writer.close()
 | 
					
						
							| 
									
										
										
										
											2023-02-03 02:18:39 -05:00
										 |  |  |         await writer.wait_closed()
 | 
					
						
							| 
									
										
										
										
											2014-10-12 20:18:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |     async def main():
 | 
					
						
							| 
									
										
										
										
											2019-09-29 21:59:55 -07:00
										 |  |  |         server = await asyncio.start_server(
 | 
					
						
							|  |  |  |             handle_echo, '127.0.0.1', 8888)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-11 20:54:44 +02:00
										 |  |  |         addrs = ', '.join(str(sock.getsockname()) for sock in server.sockets)
 | 
					
						
							|  |  |  |         print(f'Serving on {addrs}')
 | 
					
						
							| 
									
										
										
										
											2019-09-29 21:59:55 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         async with server:
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |             await server.serve_forever()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     asyncio.run(main())
 | 
					
						
							| 
									
										
										
										
											2014-10-12 20:18:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. seealso::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 15:35:24 -04:00
										 |  |  |    The :ref:`TCP echo server protocol <asyncio_example_tcp_echo_server_protocol>`
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    example uses the :meth:`loop.create_server` method.
 | 
					
						
							| 
									
										
										
										
											2014-10-12 20:18:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-11 15:52:14 +02:00
										 |  |  | Get HTTP headers
 | 
					
						
							|  |  |  | ----------------
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:25:48 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | Simple example querying HTTP headers of the URL passed on the command line::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     import asyncio
 | 
					
						
							|  |  |  |     import urllib.parse
 | 
					
						
							|  |  |  |     import sys
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-07 16:29:06 -04:00
										 |  |  |     async def print_http_headers(url):
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:25:48 +01:00
										 |  |  |         url = urllib.parse.urlsplit(url)
 | 
					
						
							| 
									
										
										
										
											2014-10-11 15:52:14 +02:00
										 |  |  |         if url.scheme == 'https':
 | 
					
						
							| 
									
										
										
										
											2019-09-29 21:59:55 -07:00
										 |  |  |             reader, writer = await asyncio.open_connection(
 | 
					
						
							|  |  |  |                 url.hostname, 443, ssl=True)
 | 
					
						
							| 
									
										
										
										
											2014-10-11 15:52:14 +02:00
										 |  |  |         else:
 | 
					
						
							| 
									
										
										
										
											2019-09-29 21:59:55 -07:00
										 |  |  |             reader, writer = await asyncio.open_connection(
 | 
					
						
							|  |  |  |                 url.hostname, 80)
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         query = (
 | 
					
						
							|  |  |  |             f"HEAD {url.path or '/'} HTTP/1.0\r\n"
 | 
					
						
							|  |  |  |             f"Host: {url.hostname}\r\n"
 | 
					
						
							|  |  |  |             f"\r\n"
 | 
					
						
							|  |  |  |         )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-29 21:59:55 -07:00
										 |  |  |         writer.write(query.encode('latin-1'))
 | 
					
						
							|  |  |  |         while True:
 | 
					
						
							|  |  |  |             line = await reader.readline()
 | 
					
						
							|  |  |  |             if not line:
 | 
					
						
							|  |  |  |                 break
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:25:48 +01:00
										 |  |  |             line = line.decode('latin1').rstrip()
 | 
					
						
							|  |  |  |             if line:
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |                 print(f'HTTP header> {line}')
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:25:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-11 15:52:14 +02:00
										 |  |  |         # Ignore the body, close the socket
 | 
					
						
							| 
									
										
										
										
											2019-09-29 21:59:55 -07:00
										 |  |  |         writer.close()
 | 
					
						
							| 
									
										
										
										
											2023-02-03 02:18:39 -05:00
										 |  |  |         await writer.wait_closed()
 | 
					
						
							| 
									
										
										
										
											2014-10-11 15:52:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:25:48 +01:00
										 |  |  |     url = sys.argv[1]
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |     asyncio.run(print_http_headers(url))
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:25:48 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | Usage::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     python example.py http://example.com/path/page.html
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-11 16:16:27 +02:00
										 |  |  | or with HTTPS::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     python example.py https://example.com/path/page.html
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 15:35:24 -04:00
										 |  |  | .. _asyncio_example_create_connection-streams:
 | 
					
						
							| 
									
										
										
										
											2014-10-11 16:16:27 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | Register an open socket to wait for data using streams
 | 
					
						
							|  |  |  | ------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Coroutine waiting until a socket receives data using the
 | 
					
						
							| 
									
										
										
										
											2019-09-29 21:59:55 -07:00
										 |  |  | :func:`open_connection` function::
 | 
					
						
							| 
									
										
										
										
											2014-10-11 16:16:27 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     import asyncio
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |     import socket
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     async 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()
 | 
					
						
							| 
									
										
										
										
											2014-10-11 16:16:27 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |         # Create a pair of connected sockets.
 | 
					
						
							|  |  |  |         rsock, wsock = socket.socketpair()
 | 
					
						
							| 
									
										
										
										
											2014-10-11 16:16:27 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |         # Register the open socket to wait for data.
 | 
					
						
							| 
									
										
										
										
											2019-09-29 21:59:55 -07:00
										 |  |  |         reader, writer = await asyncio.open_connection(sock=rsock)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Simulate the reception of data from the network
 | 
					
						
							|  |  |  |         loop.call_soon(wsock.send, 'abc'.encode())
 | 
					
						
							| 
									
										
										
										
											2014-10-11 16:16:27 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-29 21:59:55 -07:00
										 |  |  |         # Wait for data
 | 
					
						
							|  |  |  |         data = await reader.read(100)
 | 
					
						
							| 
									
										
										
										
											2014-10-11 16:16:27 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-29 21:59:55 -07:00
										 |  |  |         # Got data, we are done: close the socket
 | 
					
						
							|  |  |  |         print("Received:", data.decode())
 | 
					
						
							|  |  |  |         writer.close()
 | 
					
						
							| 
									
										
										
										
											2023-02-03 02:18:39 -05:00
										 |  |  |         await writer.wait_closed()
 | 
					
						
							| 
									
										
										
										
											2014-10-11 16:16:27 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # Close the second socket
 | 
					
						
							|  |  |  |         wsock.close()
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |     asyncio.run(wait_for_data())
 | 
					
						
							| 
									
										
										
										
											2014-10-11 16:16:27 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. seealso::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The :ref:`register an open socket to wait for data using a protocol
 | 
					
						
							| 
									
										
										
										
											2018-09-17 15:35:24 -04:00
										 |  |  |    <asyncio_example_create_connection>` example uses a low-level protocol and
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    the :meth:`loop.create_connection` method.
 | 
					
						
							| 
									
										
										
										
											2014-10-11 16:16:27 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |    The :ref:`watch a file descriptor for read events
 | 
					
						
							| 
									
										
										
										
											2018-09-17 15:35:24 -04:00
										 |  |  |    <asyncio_example_watch_fd>` example uses the low-level
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    :meth:`loop.add_reader` method to watch a file descriptor.
 |