Commit 94be874e authored by Victor Stinner's avatar Victor Stinner

asyncio doc: add TCP echo client/server using streams

parent 4e548fe0
...@@ -439,10 +439,13 @@ coroutine can be used to wait until the write buffer is flushed. ...@@ -439,10 +439,13 @@ coroutine can be used to wait until the write buffer is flushed.
Protocol examples Protocol examples
================= =================
TCP echo client .. _asyncio-tcp-echo-client-protocol:
---------------
TCP echo client example, send data and wait until the connection is closed:: TCP echo client protocol
------------------------
TCP echo client using the :meth:`BaseEventLoop.create_connection` method, send
data and wait until the connection is closed::
import asyncio import asyncio
...@@ -478,11 +481,19 @@ having to write a short coroutine to handle the exception and stop the ...@@ -478,11 +481,19 @@ having to write a short coroutine to handle the exception and stop the
running loop. At :meth:`~BaseEventLoop.run_until_complete` exit, the loop is running loop. At :meth:`~BaseEventLoop.run_until_complete` exit, the loop is
no longer running, so there is no need to stop the loop in case of an error. no longer running, so there is no need to stop the loop in case of an error.
.. seealso::
The :ref:`TCP echo client using streams <asyncio-tcp-echo-client-streams>`
example uses the :func:`asyncio.open_connection` function.
TCP echo server .. _asyncio-tcp-echo-server-protocol:
---------------
TCP echo server example, send back received data and close the connection:: TCP echo server protocol
------------------------
TCP echo server using the :meth:`BaseEventLoop.create_server` method, send back
received data and close the connection::
import asyncio import asyncio
...@@ -507,12 +518,12 @@ TCP echo server example, send back received data and close the connection:: ...@@ -507,12 +518,12 @@ TCP echo server example, send back received data and close the connection::
coro = loop.create_server(EchoServerClientProtocol, '127.0.0.1', 8888) coro = loop.create_server(EchoServerClientProtocol, '127.0.0.1', 8888)
server = loop.run_until_complete(coro) server = loop.run_until_complete(coro)
# Server requests until CTRL+c is pressed # Serve requests until CTRL+c is pressed
print('Serving on {}'.format(server.sockets[0].getsockname())) print('Serving on {}'.format(server.sockets[0].getsockname()))
try: try:
loop.run_forever() loop.run_forever()
except KeyboardInterrupt: except KeyboardInterrupt:
print("exit") pass
# Close the server # Close the server
server.close() server.close()
...@@ -524,6 +535,11 @@ TCP echo server example, send back received data and close the connection:: ...@@ -524,6 +535,11 @@ TCP echo server example, send back received data and close the connection::
methods are asynchronous. ``yield from`` is not needed because these transport methods are asynchronous. ``yield from`` is not needed because these transport
methods are not coroutines. methods are not coroutines.
.. seealso::
The :ref:`TCP echo server using streams <asyncio-tcp-echo-server-streams>`
example uses the :func:`asyncio.start_server` function.
.. _asyncio-udp-echo-client-protocol: .. _asyncio-udp-echo-client-protocol:
......
...@@ -241,6 +241,84 @@ IncompleteReadError ...@@ -241,6 +241,84 @@ IncompleteReadError
Stream examples Stream examples
=============== ===============
.. _asyncio-tcp-echo-client-streams:
TCP echo client using streams
-----------------------------
TCP echo client using the :func:`asyncio.open_connection` function::
import asyncio
def tcp_echo_client(message, loop):
reader, writer = yield from asyncio.open_connection('127.0.0.1', 8888,
loop=loop)
print('Send: %r' % message)
writer.write(message.encode())
data = yield from reader.read(100)
print('Received: %r' % data.decode())
print('Close the socket')
writer.close()
message = 'Hello World!'
loop = asyncio.get_event_loop()
loop.run_until_complete(tcp_echo_client(message, loop))
loop.close()
.. seealso::
The :ref:`TCP echo client protocol <asyncio-tcp-echo-client-protocol>`
example uses the :meth:`BaseEventLoop.create_connection` method.
.. _asyncio-tcp-echo-server-streams:
TCP echo server using streams
-----------------------------
TCP echo server using the :func:`asyncio.start_server` function::
import asyncio
@asyncio.coroutine
def handle_echo(reader, writer):
data = yield from reader.read(100)
message = data.decode()
addr = writer.get_extra_info('peername')
print("Received %r from %r" % (message, addr))
print("Send: %r" % message)
writer.write(data)
yield from writer.drain()
print("Close the client socket")
writer.close()
loop = asyncio.get_event_loop()
coro = asyncio.start_server(handle_echo, '127.0.0.1', 8888, loop=loop)
server = loop.run_until_complete(coro)
# Serve requests until CTRL+c is pressed
print('Serving on {}'.format(server.sockets[0].getsockname()))
try:
loop.run_forever()
except KeyboardInterrupt:
pass
# Close the server
server.close()
loop.run_until_complete(server.wait_closed())
loop.close()
.. seealso::
The :ref:`TCP echo server protocol <asyncio-tcp-echo-server-protocol>`
example uses the :meth:`BaseEventLoop.create_server` method.
Get HTTP headers Get HTTP headers
---------------- ----------------
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment