asyncio doc: use server.wait_closed() in TCP echo server example

This commit is contained in:
Victor Stinner 2014-10-12 11:13:40 +02:00
parent 0e34dc3737
commit c2721b41d3

View file

@ -473,6 +473,7 @@ 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.
TCP echo server TCP echo server
--------------- ---------------
@ -483,28 +484,34 @@ TCP echo server example, send back received data and close the connection::
class EchoServer(asyncio.Protocol): class EchoServer(asyncio.Protocol):
def connection_made(self, transport): def connection_made(self, transport):
peername = transport.get_extra_info('peername') peername = transport.get_extra_info('peername')
print('connection from {}'.format(peername)) print('Connection from {}'.format(peername))
self.transport = transport self.transport = transport
def data_received(self, data): def data_received(self, data):
print('data received: {}'.format(data.decode())) message = data.decode()
print('Data received: {!r}'.format(message))
print('Send: {!r}'.format(message))
self.transport.write(data) self.transport.write(data)
# close the socket print('Close the socket')
self.transport.close() self.transport.close()
loop = asyncio.get_event_loop() loop = asyncio.get_event_loop()
coro = loop.create_server(EchoServer, '127.0.0.1', 8888) coro = loop.create_server(EchoServer, '127.0.0.1', 8888)
server = loop.run_until_complete(coro) server = loop.run_until_complete(coro)
print('serving on {}'.format(server.sockets[0].getsockname()))
# Server requests until CTRL+c is pressed
print('Serving on {}'.format(server.sockets[0].getsockname()))
try: try:
loop.run_forever() loop.run_forever()
except KeyboardInterrupt: except KeyboardInterrupt:
print("exit") print("exit")
finally:
server.close() # Close the server
loop.close() server.close()
loop.run_until_complete(server.wait_closed())
loop.close()
:meth:`Transport.close` can be called immediately after :meth:`Transport.close` can be called immediately after
:meth:`WriteTransport.write` even if data are not sent yet on the socket: both :meth:`WriteTransport.write` even if data are not sent yet on the socket: both