@@ -473,6 +473,7 @@ having to write a short coroutine to handle the exception and stop the
473473running loop. At :meth: `~BaseEventLoop.run_until_complete ` exit, the loop is
474474no longer running, so there is no need to stop the loop in case of an error.
475475
476+
476477TCP echo server
477478---------------
478479
@@ -483,28 +484,34 @@ TCP echo server example, send back received data and close the connection::
483484 class EchoServer(asyncio.Protocol):
484485 def connection_made(self, transport):
485486 peername = transport.get_extra_info('peername')
486- print('connection from {}'.format(peername))
487+ print('Connection from {}'.format(peername))
487488 self.transport = transport
488489
489490 def data_received(self, data):
490- print('data received: {}'.format(data.decode()))
491+ message = data.decode()
492+ print('Data received: {!r}'.format(message))
493+
494+ print('Send: {!r}'.format(message))
491495 self.transport.write(data)
492496
493- # close the socket
497+ print('Close the socket')
494498 self.transport.close()
495499
496500 loop = asyncio.get_event_loop()
497501 coro = loop.create_server(EchoServer, '127.0.0.1', 8888)
498502 server = loop.run_until_complete(coro)
499- print('serving on {}'.format(server.sockets[0].getsockname()))
500503
504+ # Server requests until CTRL+c is pressed
505+ print('Serving on {}'.format(server.sockets[0].getsockname()))
501506 try:
502507 loop.run_forever()
503508 except KeyboardInterrupt:
504509 print("exit")
505- finally:
506- server.close()
507- loop.close()
510+
511+ # Close the server
512+ server.close()
513+ loop.run_until_complete(server.wait_closed())
514+ loop.close()
508515
509516:meth: `Transport.close ` can be called immediately after
510517:meth: `WriteTransport.write ` even if data are not sent yet on the socket: both
0 commit comments