mirror of
https://github.com/python/cpython.git
synced 2024-11-27 11:55:13 +08:00
asyncio doc: add TCP echo client/server using streams
This commit is contained in:
parent
7567865867
commit
ed051594d7
@ -439,10 +439,13 @@ coroutine can be used to wait until the write buffer is flushed.
|
||||
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
|
||||
|
||||
@ -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
|
||||
no longer running, so there is no need to stop the loop in case of an error.
|
||||
|
||||
.. seealso::
|
||||
|
||||
TCP echo server
|
||||
---------------
|
||||
The :ref:`TCP echo client using streams <asyncio-tcp-echo-client-streams>`
|
||||
example uses the :func:`asyncio.open_connection` function.
|
||||
|
||||
TCP echo server example, send back received data and close the connection::
|
||||
|
||||
.. _asyncio-tcp-echo-server-protocol:
|
||||
|
||||
TCP echo server protocol
|
||||
------------------------
|
||||
|
||||
TCP echo server using the :meth:`BaseEventLoop.create_server` method, send back
|
||||
received data and close the connection::
|
||||
|
||||
import asyncio
|
||||
|
||||
@ -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)
|
||||
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()))
|
||||
try:
|
||||
loop.run_forever()
|
||||
except KeyboardInterrupt:
|
||||
print("exit")
|
||||
pass
|
||||
|
||||
# Close the server
|
||||
server.close()
|
||||
@ -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 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:
|
||||
|
||||
|
@ -241,6 +241,84 @@ IncompleteReadError
|
||||
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
|
||||
----------------
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user