import asyncio import traceback import logging async def handle_echo(reader: asyncio.StreamReader, writer: asyncio.StreamWriter): data = await reader.read(4096) logging.info('Server received: %r', data) writer.write(data) await writer.drain() #writer.transport.abort() writer.close() async def main_coro(loop: asyncio.AbstractEventLoop): logging.basicConfig(level=logging.DEBUG) server = await asyncio.start_server(handle_echo, '127.0.0.1', 8890, loop=loop) reader, writer = await asyncio.open_connection('127.0.0.1', 8890, loop=loop) writer.write(b'Hello world!') logging.info('Client received: %r', await reader.read(4096)) # writer.transport.abort() # writer.close() await asyncio.sleep(0.1) logging.info('Client received: %r', await reader.read(4096)) logging.info('Client transport is_closing(): %r', writer.transport.is_closing()) # write() after close fails silently or raises warnings for _ in range(6): writer.write(b'Goodbye') logging.info('Client transport is_closing(): %r', writer.transport.is_closing()) # drain() after close raises ConnectionResetError try: await writer.drain() except Exception as e: traceback.print_exc() # write_eof() after close raises mysterious AttributeError try: writer.write_eof() except Exception as e: traceback.print_exc() def main(): loop = asyncio.get_event_loop() loop.set_debug(True) loop.run_until_complete(main_coro(loop)) if __name__ == '__main__': main()