import asyncio
import sys

SERVER_ADDR = '127.0.0.1'
SERVER_PORT = 8888        # change the port number if necessary

async def client():
    loop = asyncio.get_event_loop()
    reader, writer = await asyncio.open_connection(SERVER_ADDR, SERVER_PORT)

    print(f'Connected to {SERVER_ADDR} at port {SERVER_PORT}.')
    print('To quit, type "/quit".')

    main_task = asyncio.current_task()

    # Read messages from the server
    async def read_messages():
        while True:
            data = await reader.readline()
            if not data:
                print("Connection closed by server.")
                main_task.cancel()
                return
            print(data.decode(), end='') # the received message already contains a trailing newline
    
    asyncio.create_task(read_messages())
    
    # Get user input and send it to the server
    try:
        while True:
            msg = await loop.run_in_executor(None, sys.stdin.readline)
            if not msg:
                continue
            # if complete line, make sure message ends in CRLF
            if msg[-1] == '\n':
                msg = msg.rstrip() + '\r\n'
            if msg.lower() == '/quit\r\n':
                return
            writer.write(msg.encode())
            await writer.drain()
    except asyncio.CancelledError:
        sys.exit(0)

    writer.close()
    await writer.wait_closed()

asyncio.run(client())
