17db96d56Sopenharmony_ci.. currentmodule:: asyncio
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ci.. _asyncio-streams:
47db96d56Sopenharmony_ci
57db96d56Sopenharmony_ci=======
67db96d56Sopenharmony_ciStreams
77db96d56Sopenharmony_ci=======
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ci**Source code:** :source:`Lib/asyncio/streams.py`
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci-------------------------------------------------
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_ciStreams are high-level async/await-ready primitives to work with
147db96d56Sopenharmony_cinetwork connections.  Streams allow sending and receiving data without
157db96d56Sopenharmony_ciusing callbacks or low-level protocols and transports.
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ci.. _asyncio_example_stream:
187db96d56Sopenharmony_ci
197db96d56Sopenharmony_ciHere is an example of a TCP echo client written using asyncio
207db96d56Sopenharmony_cistreams::
217db96d56Sopenharmony_ci
227db96d56Sopenharmony_ci    import asyncio
237db96d56Sopenharmony_ci
247db96d56Sopenharmony_ci    async def tcp_echo_client(message):
257db96d56Sopenharmony_ci        reader, writer = await asyncio.open_connection(
267db96d56Sopenharmony_ci            '127.0.0.1', 8888)
277db96d56Sopenharmony_ci
287db96d56Sopenharmony_ci        print(f'Send: {message!r}')
297db96d56Sopenharmony_ci        writer.write(message.encode())
307db96d56Sopenharmony_ci        await writer.drain()
317db96d56Sopenharmony_ci
327db96d56Sopenharmony_ci        data = await reader.read(100)
337db96d56Sopenharmony_ci        print(f'Received: {data.decode()!r}')
347db96d56Sopenharmony_ci
357db96d56Sopenharmony_ci        print('Close the connection')
367db96d56Sopenharmony_ci        writer.close()
377db96d56Sopenharmony_ci        await writer.wait_closed()
387db96d56Sopenharmony_ci
397db96d56Sopenharmony_ci    asyncio.run(tcp_echo_client('Hello World!'))
407db96d56Sopenharmony_ci
417db96d56Sopenharmony_ci
427db96d56Sopenharmony_ciSee also the `Examples`_ section below.
437db96d56Sopenharmony_ci
447db96d56Sopenharmony_ci
457db96d56Sopenharmony_ci.. rubric:: Stream Functions
467db96d56Sopenharmony_ci
477db96d56Sopenharmony_ciThe following top-level asyncio functions can be used to create
487db96d56Sopenharmony_ciand work with streams:
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_ci
517db96d56Sopenharmony_ci.. coroutinefunction:: open_connection(host=None, port=None, *, \
527db96d56Sopenharmony_ci                          limit=None, ssl=None, family=0, proto=0, \
537db96d56Sopenharmony_ci                          flags=0, sock=None, local_addr=None, \
547db96d56Sopenharmony_ci                          server_hostname=None, ssl_handshake_timeout=None, \
557db96d56Sopenharmony_ci                          ssl_shutdown_timeout=None, \
567db96d56Sopenharmony_ci                          happy_eyeballs_delay=None, interleave=None)
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ci   Establish a network connection and return a pair of
597db96d56Sopenharmony_ci   ``(reader, writer)`` objects.
607db96d56Sopenharmony_ci
617db96d56Sopenharmony_ci   The returned *reader* and *writer* objects are instances of
627db96d56Sopenharmony_ci   :class:`StreamReader` and :class:`StreamWriter` classes.
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ci   *limit* determines the buffer size limit used by the
657db96d56Sopenharmony_ci   returned :class:`StreamReader` instance.  By default the *limit*
667db96d56Sopenharmony_ci   is set to 64 KiB.
677db96d56Sopenharmony_ci
687db96d56Sopenharmony_ci   The rest of the arguments are passed directly to
697db96d56Sopenharmony_ci   :meth:`loop.create_connection`.
707db96d56Sopenharmony_ci
717db96d56Sopenharmony_ci   .. note::
727db96d56Sopenharmony_ci
737db96d56Sopenharmony_ci      The *sock* argument transfers ownership of the socket to the
747db96d56Sopenharmony_ci      :class:`StreamWriter` created. To close the socket, call its
757db96d56Sopenharmony_ci      :meth:`~asyncio.StreamWriter.close` method.
767db96d56Sopenharmony_ci
777db96d56Sopenharmony_ci   .. versionchanged:: 3.7
787db96d56Sopenharmony_ci      Added the *ssl_handshake_timeout* parameter.
797db96d56Sopenharmony_ci
807db96d56Sopenharmony_ci   .. versionadded:: 3.8
817db96d56Sopenharmony_ci      Added *happy_eyeballs_delay* and *interleave* parameters.
827db96d56Sopenharmony_ci
837db96d56Sopenharmony_ci   .. versionchanged:: 3.10
847db96d56Sopenharmony_ci      Removed the *loop* parameter.
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ci   .. versionchanged:: 3.11
877db96d56Sopenharmony_ci      Added the *ssl_shutdown_timeout* parameter.
887db96d56Sopenharmony_ci
897db96d56Sopenharmony_ci
907db96d56Sopenharmony_ci.. coroutinefunction:: start_server(client_connected_cb, host=None, \
917db96d56Sopenharmony_ci                          port=None, *, limit=None, \
927db96d56Sopenharmony_ci                          family=socket.AF_UNSPEC, \
937db96d56Sopenharmony_ci                          flags=socket.AI_PASSIVE, sock=None, \
947db96d56Sopenharmony_ci                          backlog=100, ssl=None, reuse_address=None, \
957db96d56Sopenharmony_ci                          reuse_port=None, ssl_handshake_timeout=None, \
967db96d56Sopenharmony_ci                          ssl_shutdown_timeout=None, start_serving=True)
977db96d56Sopenharmony_ci
987db96d56Sopenharmony_ci   Start a socket server.
997db96d56Sopenharmony_ci
1007db96d56Sopenharmony_ci   The *client_connected_cb* callback is called whenever a new client
1017db96d56Sopenharmony_ci   connection is established.  It receives a ``(reader, writer)`` pair
1027db96d56Sopenharmony_ci   as two arguments, instances of the :class:`StreamReader` and
1037db96d56Sopenharmony_ci   :class:`StreamWriter` classes.
1047db96d56Sopenharmony_ci
1057db96d56Sopenharmony_ci   *client_connected_cb* can be a plain callable or a
1067db96d56Sopenharmony_ci   :ref:`coroutine function <coroutine>`; if it is a coroutine function,
1077db96d56Sopenharmony_ci   it will be automatically scheduled as a :class:`Task`.
1087db96d56Sopenharmony_ci
1097db96d56Sopenharmony_ci   *limit* determines the buffer size limit used by the
1107db96d56Sopenharmony_ci   returned :class:`StreamReader` instance.  By default the *limit*
1117db96d56Sopenharmony_ci   is set to 64 KiB.
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ci   The rest of the arguments are passed directly to
1147db96d56Sopenharmony_ci   :meth:`loop.create_server`.
1157db96d56Sopenharmony_ci
1167db96d56Sopenharmony_ci   .. note::
1177db96d56Sopenharmony_ci
1187db96d56Sopenharmony_ci      The *sock* argument transfers ownership of the socket to the
1197db96d56Sopenharmony_ci      server created. To close the socket, call the server's
1207db96d56Sopenharmony_ci      :meth:`~asyncio.Server.close` method.
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ci   .. versionchanged:: 3.7
1237db96d56Sopenharmony_ci      Added the *ssl_handshake_timeout* and *start_serving* parameters.
1247db96d56Sopenharmony_ci
1257db96d56Sopenharmony_ci   .. versionchanged:: 3.10
1267db96d56Sopenharmony_ci      Removed the *loop* parameter.
1277db96d56Sopenharmony_ci
1287db96d56Sopenharmony_ci   .. versionchanged:: 3.11
1297db96d56Sopenharmony_ci      Added the *ssl_shutdown_timeout* parameter.
1307db96d56Sopenharmony_ci
1317db96d56Sopenharmony_ci
1327db96d56Sopenharmony_ci.. rubric:: Unix Sockets
1337db96d56Sopenharmony_ci
1347db96d56Sopenharmony_ci.. coroutinefunction:: open_unix_connection(path=None, *, limit=None, \
1357db96d56Sopenharmony_ci                        ssl=None, sock=None, server_hostname=None, \
1367db96d56Sopenharmony_ci                        ssl_handshake_timeout=None, ssl_shutdown_timeout=None)
1377db96d56Sopenharmony_ci
1387db96d56Sopenharmony_ci   Establish a Unix socket connection and return a pair of
1397db96d56Sopenharmony_ci   ``(reader, writer)``.
1407db96d56Sopenharmony_ci
1417db96d56Sopenharmony_ci   Similar to :func:`open_connection` but operates on Unix sockets.
1427db96d56Sopenharmony_ci
1437db96d56Sopenharmony_ci   See also the documentation of :meth:`loop.create_unix_connection`.
1447db96d56Sopenharmony_ci
1457db96d56Sopenharmony_ci   .. note::
1467db96d56Sopenharmony_ci
1477db96d56Sopenharmony_ci      The *sock* argument transfers ownership of the socket to the
1487db96d56Sopenharmony_ci      :class:`StreamWriter` created. To close the socket, call its
1497db96d56Sopenharmony_ci      :meth:`~asyncio.StreamWriter.close` method.
1507db96d56Sopenharmony_ci
1517db96d56Sopenharmony_ci   .. availability:: Unix.
1527db96d56Sopenharmony_ci
1537db96d56Sopenharmony_ci   .. versionchanged:: 3.7
1547db96d56Sopenharmony_ci      Added the *ssl_handshake_timeout* parameter.
1557db96d56Sopenharmony_ci      The *path* parameter can now be a :term:`path-like object`
1567db96d56Sopenharmony_ci
1577db96d56Sopenharmony_ci   .. versionchanged:: 3.10
1587db96d56Sopenharmony_ci      Removed the *loop* parameter.
1597db96d56Sopenharmony_ci
1607db96d56Sopenharmony_ci  .. versionchanged:: 3.11
1617db96d56Sopenharmony_ci     Added the *ssl_shutdown_timeout* parameter.
1627db96d56Sopenharmony_ci
1637db96d56Sopenharmony_ci
1647db96d56Sopenharmony_ci.. coroutinefunction:: start_unix_server(client_connected_cb, path=None, \
1657db96d56Sopenharmony_ci                          *, limit=None, sock=None, backlog=100, ssl=None, \
1667db96d56Sopenharmony_ci                          ssl_handshake_timeout=None, \
1677db96d56Sopenharmony_ci                          ssl_shutdown_timeout=None, start_serving=True)
1687db96d56Sopenharmony_ci
1697db96d56Sopenharmony_ci   Start a Unix socket server.
1707db96d56Sopenharmony_ci
1717db96d56Sopenharmony_ci   Similar to :func:`start_server` but works with Unix sockets.
1727db96d56Sopenharmony_ci
1737db96d56Sopenharmony_ci   See also the documentation of :meth:`loop.create_unix_server`.
1747db96d56Sopenharmony_ci
1757db96d56Sopenharmony_ci   .. note::
1767db96d56Sopenharmony_ci
1777db96d56Sopenharmony_ci      The *sock* argument transfers ownership of the socket to the
1787db96d56Sopenharmony_ci      server created. To close the socket, call the server's
1797db96d56Sopenharmony_ci      :meth:`~asyncio.Server.close` method.
1807db96d56Sopenharmony_ci
1817db96d56Sopenharmony_ci   .. availability:: Unix.
1827db96d56Sopenharmony_ci
1837db96d56Sopenharmony_ci   .. versionchanged:: 3.7
1847db96d56Sopenharmony_ci      Added the *ssl_handshake_timeout* and *start_serving* parameters.
1857db96d56Sopenharmony_ci      The *path* parameter can now be a :term:`path-like object`.
1867db96d56Sopenharmony_ci
1877db96d56Sopenharmony_ci   .. versionchanged:: 3.10
1887db96d56Sopenharmony_ci      Removed the *loop* parameter.
1897db96d56Sopenharmony_ci
1907db96d56Sopenharmony_ci   .. versionchanged:: 3.11
1917db96d56Sopenharmony_ci      Added the *ssl_shutdown_timeout* parameter.
1927db96d56Sopenharmony_ci
1937db96d56Sopenharmony_ci
1947db96d56Sopenharmony_ciStreamReader
1957db96d56Sopenharmony_ci============
1967db96d56Sopenharmony_ci
1977db96d56Sopenharmony_ci.. class:: StreamReader
1987db96d56Sopenharmony_ci
1997db96d56Sopenharmony_ci   Represents a reader object that provides APIs to read data
2007db96d56Sopenharmony_ci   from the IO stream. As an :term:`asynchronous iterable`, the
2017db96d56Sopenharmony_ci   object supports the :keyword:`async for` statement.
2027db96d56Sopenharmony_ci
2037db96d56Sopenharmony_ci   It is not recommended to instantiate *StreamReader* objects
2047db96d56Sopenharmony_ci   directly; use :func:`open_connection` and :func:`start_server`
2057db96d56Sopenharmony_ci   instead.
2067db96d56Sopenharmony_ci
2077db96d56Sopenharmony_ci   .. coroutinemethod:: read(n=-1)
2087db96d56Sopenharmony_ci
2097db96d56Sopenharmony_ci      Read up to *n* bytes from the stream.
2107db96d56Sopenharmony_ci
2117db96d56Sopenharmony_ci      If *n* is not provided or set to ``-1``,
2127db96d56Sopenharmony_ci      read until EOF, then return all read :class:`bytes`.
2137db96d56Sopenharmony_ci      If EOF was received and the internal buffer is empty,
2147db96d56Sopenharmony_ci      return an empty ``bytes`` object.
2157db96d56Sopenharmony_ci
2167db96d56Sopenharmony_ci      If *n* is ``0``, return an empty ``bytes`` object immediately.
2177db96d56Sopenharmony_ci
2187db96d56Sopenharmony_ci      If *n* is positive, return at most *n* available ``bytes``
2197db96d56Sopenharmony_ci      as soon as at least 1 byte is available in the internal buffer.
2207db96d56Sopenharmony_ci      If EOF is received before any byte is read, return an empty
2217db96d56Sopenharmony_ci      ``bytes`` object.
2227db96d56Sopenharmony_ci
2237db96d56Sopenharmony_ci   .. coroutinemethod:: readline()
2247db96d56Sopenharmony_ci
2257db96d56Sopenharmony_ci      Read one line, where "line" is a sequence of bytes
2267db96d56Sopenharmony_ci      ending with ``\n``.
2277db96d56Sopenharmony_ci
2287db96d56Sopenharmony_ci      If EOF is received and ``\n`` was not found, the method
2297db96d56Sopenharmony_ci      returns partially read data.
2307db96d56Sopenharmony_ci
2317db96d56Sopenharmony_ci      If EOF is received and the internal buffer is empty,
2327db96d56Sopenharmony_ci      return an empty ``bytes`` object.
2337db96d56Sopenharmony_ci
2347db96d56Sopenharmony_ci   .. coroutinemethod:: readexactly(n)
2357db96d56Sopenharmony_ci
2367db96d56Sopenharmony_ci      Read exactly *n* bytes.
2377db96d56Sopenharmony_ci
2387db96d56Sopenharmony_ci      Raise an :exc:`IncompleteReadError` if EOF is reached before *n*
2397db96d56Sopenharmony_ci      can be read.  Use the :attr:`IncompleteReadError.partial`
2407db96d56Sopenharmony_ci      attribute to get the partially read data.
2417db96d56Sopenharmony_ci
2427db96d56Sopenharmony_ci   .. coroutinemethod:: readuntil(separator=b'\n')
2437db96d56Sopenharmony_ci
2447db96d56Sopenharmony_ci      Read data from the stream until *separator* is found.
2457db96d56Sopenharmony_ci
2467db96d56Sopenharmony_ci      On success, the data and separator will be removed from the
2477db96d56Sopenharmony_ci      internal buffer (consumed). Returned data will include the
2487db96d56Sopenharmony_ci      separator at the end.
2497db96d56Sopenharmony_ci
2507db96d56Sopenharmony_ci      If the amount of data read exceeds the configured stream limit, a
2517db96d56Sopenharmony_ci      :exc:`LimitOverrunError` exception is raised, and the data
2527db96d56Sopenharmony_ci      is left in the internal buffer and can be read again.
2537db96d56Sopenharmony_ci
2547db96d56Sopenharmony_ci      If EOF is reached before the complete separator is found,
2557db96d56Sopenharmony_ci      an :exc:`IncompleteReadError` exception is raised, and the internal
2567db96d56Sopenharmony_ci      buffer is reset.  The :attr:`IncompleteReadError.partial` attribute
2577db96d56Sopenharmony_ci      may contain a portion of the separator.
2587db96d56Sopenharmony_ci
2597db96d56Sopenharmony_ci      .. versionadded:: 3.5.2
2607db96d56Sopenharmony_ci
2617db96d56Sopenharmony_ci   .. method:: at_eof()
2627db96d56Sopenharmony_ci
2637db96d56Sopenharmony_ci      Return ``True`` if the buffer is empty and :meth:`feed_eof`
2647db96d56Sopenharmony_ci      was called.
2657db96d56Sopenharmony_ci
2667db96d56Sopenharmony_ci
2677db96d56Sopenharmony_ciStreamWriter
2687db96d56Sopenharmony_ci============
2697db96d56Sopenharmony_ci
2707db96d56Sopenharmony_ci.. class:: StreamWriter
2717db96d56Sopenharmony_ci
2727db96d56Sopenharmony_ci   Represents a writer object that provides APIs to write data
2737db96d56Sopenharmony_ci   to the IO stream.
2747db96d56Sopenharmony_ci
2757db96d56Sopenharmony_ci   It is not recommended to instantiate *StreamWriter* objects
2767db96d56Sopenharmony_ci   directly; use :func:`open_connection` and :func:`start_server`
2777db96d56Sopenharmony_ci   instead.
2787db96d56Sopenharmony_ci
2797db96d56Sopenharmony_ci   .. method:: write(data)
2807db96d56Sopenharmony_ci
2817db96d56Sopenharmony_ci      The method attempts to write the *data* to the underlying socket immediately.
2827db96d56Sopenharmony_ci      If that fails, the data is queued in an internal write buffer until it can be
2837db96d56Sopenharmony_ci      sent.
2847db96d56Sopenharmony_ci
2857db96d56Sopenharmony_ci      The method should be used along with the ``drain()`` method::
2867db96d56Sopenharmony_ci
2877db96d56Sopenharmony_ci         stream.write(data)
2887db96d56Sopenharmony_ci         await stream.drain()
2897db96d56Sopenharmony_ci
2907db96d56Sopenharmony_ci   .. method:: writelines(data)
2917db96d56Sopenharmony_ci
2927db96d56Sopenharmony_ci      The method writes a list (or any iterable) of bytes to the underlying socket
2937db96d56Sopenharmony_ci      immediately.
2947db96d56Sopenharmony_ci      If that fails, the data is queued in an internal write buffer until it can be
2957db96d56Sopenharmony_ci      sent.
2967db96d56Sopenharmony_ci
2977db96d56Sopenharmony_ci      The method should be used along with the ``drain()`` method::
2987db96d56Sopenharmony_ci
2997db96d56Sopenharmony_ci         stream.writelines(lines)
3007db96d56Sopenharmony_ci         await stream.drain()
3017db96d56Sopenharmony_ci
3027db96d56Sopenharmony_ci   .. method:: close()
3037db96d56Sopenharmony_ci
3047db96d56Sopenharmony_ci      The method closes the stream and the underlying socket.
3057db96d56Sopenharmony_ci
3067db96d56Sopenharmony_ci      The method should be used, though not mandatory,
3077db96d56Sopenharmony_ci      along with the ``wait_closed()`` method::
3087db96d56Sopenharmony_ci
3097db96d56Sopenharmony_ci         stream.close()
3107db96d56Sopenharmony_ci         await stream.wait_closed()
3117db96d56Sopenharmony_ci
3127db96d56Sopenharmony_ci   .. method:: can_write_eof()
3137db96d56Sopenharmony_ci
3147db96d56Sopenharmony_ci      Return ``True`` if the underlying transport supports
3157db96d56Sopenharmony_ci      the :meth:`write_eof` method, ``False`` otherwise.
3167db96d56Sopenharmony_ci
3177db96d56Sopenharmony_ci   .. method:: write_eof()
3187db96d56Sopenharmony_ci
3197db96d56Sopenharmony_ci      Close the write end of the stream after the buffered write
3207db96d56Sopenharmony_ci      data is flushed.
3217db96d56Sopenharmony_ci
3227db96d56Sopenharmony_ci   .. attribute:: transport
3237db96d56Sopenharmony_ci
3247db96d56Sopenharmony_ci      Return the underlying asyncio transport.
3257db96d56Sopenharmony_ci
3267db96d56Sopenharmony_ci   .. method:: get_extra_info(name, default=None)
3277db96d56Sopenharmony_ci
3287db96d56Sopenharmony_ci      Access optional transport information; see
3297db96d56Sopenharmony_ci      :meth:`BaseTransport.get_extra_info` for details.
3307db96d56Sopenharmony_ci
3317db96d56Sopenharmony_ci   .. coroutinemethod:: drain()
3327db96d56Sopenharmony_ci
3337db96d56Sopenharmony_ci      Wait until it is appropriate to resume writing to the stream.
3347db96d56Sopenharmony_ci      Example::
3357db96d56Sopenharmony_ci
3367db96d56Sopenharmony_ci          writer.write(data)
3377db96d56Sopenharmony_ci          await writer.drain()
3387db96d56Sopenharmony_ci
3397db96d56Sopenharmony_ci      This is a flow control method that interacts with the underlying
3407db96d56Sopenharmony_ci      IO write buffer.  When the size of the buffer reaches
3417db96d56Sopenharmony_ci      the high watermark, *drain()* blocks until the size of the
3427db96d56Sopenharmony_ci      buffer is drained down to the low watermark and writing can
3437db96d56Sopenharmony_ci      be resumed.  When there is nothing to wait for, the :meth:`drain`
3447db96d56Sopenharmony_ci      returns immediately.
3457db96d56Sopenharmony_ci
3467db96d56Sopenharmony_ci   .. coroutinemethod:: start_tls(sslcontext, \*, server_hostname=None, \
3477db96d56Sopenharmony_ci                          ssl_handshake_timeout=None)
3487db96d56Sopenharmony_ci
3497db96d56Sopenharmony_ci      Upgrade an existing stream-based connection to TLS.
3507db96d56Sopenharmony_ci
3517db96d56Sopenharmony_ci      Parameters:
3527db96d56Sopenharmony_ci
3537db96d56Sopenharmony_ci      * *sslcontext*: a configured instance of :class:`~ssl.SSLContext`.
3547db96d56Sopenharmony_ci
3557db96d56Sopenharmony_ci      * *server_hostname*: sets or overrides the host name that the target
3567db96d56Sopenharmony_ci        server's certificate will be matched against.
3577db96d56Sopenharmony_ci
3587db96d56Sopenharmony_ci      * *ssl_handshake_timeout* is the time in seconds to wait for the TLS
3597db96d56Sopenharmony_ci        handshake to complete before aborting the connection.  ``60.0`` seconds
3607db96d56Sopenharmony_ci        if ``None`` (default).
3617db96d56Sopenharmony_ci
3627db96d56Sopenharmony_ci      .. versionadded:: 3.11
3637db96d56Sopenharmony_ci
3647db96d56Sopenharmony_ci   .. method:: is_closing()
3657db96d56Sopenharmony_ci
3667db96d56Sopenharmony_ci      Return ``True`` if the stream is closed or in the process of
3677db96d56Sopenharmony_ci      being closed.
3687db96d56Sopenharmony_ci
3697db96d56Sopenharmony_ci      .. versionadded:: 3.7
3707db96d56Sopenharmony_ci
3717db96d56Sopenharmony_ci   .. coroutinemethod:: wait_closed()
3727db96d56Sopenharmony_ci
3737db96d56Sopenharmony_ci      Wait until the stream is closed.
3747db96d56Sopenharmony_ci
3757db96d56Sopenharmony_ci      Should be called after :meth:`close` to wait until the underlying
3767db96d56Sopenharmony_ci      connection is closed, ensuring that all data has been flushed
3777db96d56Sopenharmony_ci      before e.g. exiting the program.
3787db96d56Sopenharmony_ci
3797db96d56Sopenharmony_ci      .. versionadded:: 3.7
3807db96d56Sopenharmony_ci
3817db96d56Sopenharmony_ci
3827db96d56Sopenharmony_ciExamples
3837db96d56Sopenharmony_ci========
3847db96d56Sopenharmony_ci
3857db96d56Sopenharmony_ci.. _asyncio-tcp-echo-client-streams:
3867db96d56Sopenharmony_ci
3877db96d56Sopenharmony_ciTCP echo client using streams
3887db96d56Sopenharmony_ci-----------------------------
3897db96d56Sopenharmony_ci
3907db96d56Sopenharmony_ciTCP echo client using the :func:`asyncio.open_connection` function::
3917db96d56Sopenharmony_ci
3927db96d56Sopenharmony_ci    import asyncio
3937db96d56Sopenharmony_ci
3947db96d56Sopenharmony_ci    async def tcp_echo_client(message):
3957db96d56Sopenharmony_ci        reader, writer = await asyncio.open_connection(
3967db96d56Sopenharmony_ci            '127.0.0.1', 8888)
3977db96d56Sopenharmony_ci
3987db96d56Sopenharmony_ci        print(f'Send: {message!r}')
3997db96d56Sopenharmony_ci        writer.write(message.encode())
4007db96d56Sopenharmony_ci        await writer.drain()
4017db96d56Sopenharmony_ci
4027db96d56Sopenharmony_ci        data = await reader.read(100)
4037db96d56Sopenharmony_ci        print(f'Received: {data.decode()!r}')
4047db96d56Sopenharmony_ci
4057db96d56Sopenharmony_ci        print('Close the connection')
4067db96d56Sopenharmony_ci        writer.close()
4077db96d56Sopenharmony_ci        await writer.wait_closed()
4087db96d56Sopenharmony_ci
4097db96d56Sopenharmony_ci    asyncio.run(tcp_echo_client('Hello World!'))
4107db96d56Sopenharmony_ci
4117db96d56Sopenharmony_ci
4127db96d56Sopenharmony_ci.. seealso::
4137db96d56Sopenharmony_ci
4147db96d56Sopenharmony_ci   The :ref:`TCP echo client protocol <asyncio_example_tcp_echo_client_protocol>`
4157db96d56Sopenharmony_ci   example uses the low-level :meth:`loop.create_connection` method.
4167db96d56Sopenharmony_ci
4177db96d56Sopenharmony_ci
4187db96d56Sopenharmony_ci.. _asyncio-tcp-echo-server-streams:
4197db96d56Sopenharmony_ci
4207db96d56Sopenharmony_ciTCP echo server using streams
4217db96d56Sopenharmony_ci-----------------------------
4227db96d56Sopenharmony_ci
4237db96d56Sopenharmony_ciTCP echo server using the :func:`asyncio.start_server` function::
4247db96d56Sopenharmony_ci
4257db96d56Sopenharmony_ci    import asyncio
4267db96d56Sopenharmony_ci
4277db96d56Sopenharmony_ci    async def handle_echo(reader, writer):
4287db96d56Sopenharmony_ci        data = await reader.read(100)
4297db96d56Sopenharmony_ci        message = data.decode()
4307db96d56Sopenharmony_ci        addr = writer.get_extra_info('peername')
4317db96d56Sopenharmony_ci
4327db96d56Sopenharmony_ci        print(f"Received {message!r} from {addr!r}")
4337db96d56Sopenharmony_ci
4347db96d56Sopenharmony_ci        print(f"Send: {message!r}")
4357db96d56Sopenharmony_ci        writer.write(data)
4367db96d56Sopenharmony_ci        await writer.drain()
4377db96d56Sopenharmony_ci
4387db96d56Sopenharmony_ci        print("Close the connection")
4397db96d56Sopenharmony_ci        writer.close()
4407db96d56Sopenharmony_ci        await writer.wait_closed()
4417db96d56Sopenharmony_ci
4427db96d56Sopenharmony_ci    async def main():
4437db96d56Sopenharmony_ci        server = await asyncio.start_server(
4447db96d56Sopenharmony_ci            handle_echo, '127.0.0.1', 8888)
4457db96d56Sopenharmony_ci
4467db96d56Sopenharmony_ci        addrs = ', '.join(str(sock.getsockname()) for sock in server.sockets)
4477db96d56Sopenharmony_ci        print(f'Serving on {addrs}')
4487db96d56Sopenharmony_ci
4497db96d56Sopenharmony_ci        async with server:
4507db96d56Sopenharmony_ci            await server.serve_forever()
4517db96d56Sopenharmony_ci
4527db96d56Sopenharmony_ci    asyncio.run(main())
4537db96d56Sopenharmony_ci
4547db96d56Sopenharmony_ci
4557db96d56Sopenharmony_ci.. seealso::
4567db96d56Sopenharmony_ci
4577db96d56Sopenharmony_ci   The :ref:`TCP echo server protocol <asyncio_example_tcp_echo_server_protocol>`
4587db96d56Sopenharmony_ci   example uses the :meth:`loop.create_server` method.
4597db96d56Sopenharmony_ci
4607db96d56Sopenharmony_ci
4617db96d56Sopenharmony_ciGet HTTP headers
4627db96d56Sopenharmony_ci----------------
4637db96d56Sopenharmony_ci
4647db96d56Sopenharmony_ciSimple example querying HTTP headers of the URL passed on the command line::
4657db96d56Sopenharmony_ci
4667db96d56Sopenharmony_ci    import asyncio
4677db96d56Sopenharmony_ci    import urllib.parse
4687db96d56Sopenharmony_ci    import sys
4697db96d56Sopenharmony_ci
4707db96d56Sopenharmony_ci    async def print_http_headers(url):
4717db96d56Sopenharmony_ci        url = urllib.parse.urlsplit(url)
4727db96d56Sopenharmony_ci        if url.scheme == 'https':
4737db96d56Sopenharmony_ci            reader, writer = await asyncio.open_connection(
4747db96d56Sopenharmony_ci                url.hostname, 443, ssl=True)
4757db96d56Sopenharmony_ci        else:
4767db96d56Sopenharmony_ci            reader, writer = await asyncio.open_connection(
4777db96d56Sopenharmony_ci                url.hostname, 80)
4787db96d56Sopenharmony_ci
4797db96d56Sopenharmony_ci        query = (
4807db96d56Sopenharmony_ci            f"HEAD {url.path or '/'} HTTP/1.0\r\n"
4817db96d56Sopenharmony_ci            f"Host: {url.hostname}\r\n"
4827db96d56Sopenharmony_ci            f"\r\n"
4837db96d56Sopenharmony_ci        )
4847db96d56Sopenharmony_ci
4857db96d56Sopenharmony_ci        writer.write(query.encode('latin-1'))
4867db96d56Sopenharmony_ci        while True:
4877db96d56Sopenharmony_ci            line = await reader.readline()
4887db96d56Sopenharmony_ci            if not line:
4897db96d56Sopenharmony_ci                break
4907db96d56Sopenharmony_ci
4917db96d56Sopenharmony_ci            line = line.decode('latin1').rstrip()
4927db96d56Sopenharmony_ci            if line:
4937db96d56Sopenharmony_ci                print(f'HTTP header> {line}')
4947db96d56Sopenharmony_ci
4957db96d56Sopenharmony_ci        # Ignore the body, close the socket
4967db96d56Sopenharmony_ci        writer.close()
4977db96d56Sopenharmony_ci        await writer.wait_closed()
4987db96d56Sopenharmony_ci
4997db96d56Sopenharmony_ci    url = sys.argv[1]
5007db96d56Sopenharmony_ci    asyncio.run(print_http_headers(url))
5017db96d56Sopenharmony_ci
5027db96d56Sopenharmony_ci
5037db96d56Sopenharmony_ciUsage::
5047db96d56Sopenharmony_ci
5057db96d56Sopenharmony_ci    python example.py http://example.com/path/page.html
5067db96d56Sopenharmony_ci
5077db96d56Sopenharmony_cior with HTTPS::
5087db96d56Sopenharmony_ci
5097db96d56Sopenharmony_ci    python example.py https://example.com/path/page.html
5107db96d56Sopenharmony_ci
5117db96d56Sopenharmony_ci
5127db96d56Sopenharmony_ci.. _asyncio_example_create_connection-streams:
5137db96d56Sopenharmony_ci
5147db96d56Sopenharmony_ciRegister an open socket to wait for data using streams
5157db96d56Sopenharmony_ci------------------------------------------------------
5167db96d56Sopenharmony_ci
5177db96d56Sopenharmony_ciCoroutine waiting until a socket receives data using the
5187db96d56Sopenharmony_ci:func:`open_connection` function::
5197db96d56Sopenharmony_ci
5207db96d56Sopenharmony_ci    import asyncio
5217db96d56Sopenharmony_ci    import socket
5227db96d56Sopenharmony_ci
5237db96d56Sopenharmony_ci    async def wait_for_data():
5247db96d56Sopenharmony_ci        # Get a reference to the current event loop because
5257db96d56Sopenharmony_ci        # we want to access low-level APIs.
5267db96d56Sopenharmony_ci        loop = asyncio.get_running_loop()
5277db96d56Sopenharmony_ci
5287db96d56Sopenharmony_ci        # Create a pair of connected sockets.
5297db96d56Sopenharmony_ci        rsock, wsock = socket.socketpair()
5307db96d56Sopenharmony_ci
5317db96d56Sopenharmony_ci        # Register the open socket to wait for data.
5327db96d56Sopenharmony_ci        reader, writer = await asyncio.open_connection(sock=rsock)
5337db96d56Sopenharmony_ci
5347db96d56Sopenharmony_ci        # Simulate the reception of data from the network
5357db96d56Sopenharmony_ci        loop.call_soon(wsock.send, 'abc'.encode())
5367db96d56Sopenharmony_ci
5377db96d56Sopenharmony_ci        # Wait for data
5387db96d56Sopenharmony_ci        data = await reader.read(100)
5397db96d56Sopenharmony_ci
5407db96d56Sopenharmony_ci        # Got data, we are done: close the socket
5417db96d56Sopenharmony_ci        print("Received:", data.decode())
5427db96d56Sopenharmony_ci        writer.close()
5437db96d56Sopenharmony_ci        await writer.wait_closed()
5447db96d56Sopenharmony_ci
5457db96d56Sopenharmony_ci        # Close the second socket
5467db96d56Sopenharmony_ci        wsock.close()
5477db96d56Sopenharmony_ci
5487db96d56Sopenharmony_ci    asyncio.run(wait_for_data())
5497db96d56Sopenharmony_ci
5507db96d56Sopenharmony_ci.. seealso::
5517db96d56Sopenharmony_ci
5527db96d56Sopenharmony_ci   The :ref:`register an open socket to wait for data using a protocol
5537db96d56Sopenharmony_ci   <asyncio_example_create_connection>` example uses a low-level protocol and
5547db96d56Sopenharmony_ci   the :meth:`loop.create_connection` method.
5557db96d56Sopenharmony_ci
5567db96d56Sopenharmony_ci   The :ref:`watch a file descriptor for read events
5577db96d56Sopenharmony_ci   <asyncio_example_watch_fd>` example uses the low-level
5587db96d56Sopenharmony_ci   :meth:`loop.add_reader` method to watch a file descriptor.
559