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