Простой скрипт чата с Asyncio - PullRequest
0 голосов
/ 20 марта 2020

Я пытался написать простой скрипт чата с asyncio и не могу заставить его работать правильно. Я пытался понять asyncio, но для меня это очень сложно, и, к сожалению, я нигде не нашел никаких рабочих решений. Цель состоит в том, чтобы несколько человек могли отправлять сообщения на сервер и одновременно получать все, что отправляют другие клиенты.

Серверный скрипт:

import asyncio

writers = []

def forward(writer, addr, message):
    for w in writers:
        if w != writer:
            w.write(f"{addr!r}: {message!r}\n".encode())

async def handle(reader, writer):
    writers.append(writer)
    addr = writer.get_extra_info('peername')
    message = f"{addr!r} is connected !!!!"
    print(message)
    forward(writer, addr, message)
    while True:
        data = await reader.read(100)
        message = data.decode().strip()
        forward(writer, addr, message)
        await writer.drain()
        if message == "exit":
            message = f"{addr!r} wants to close the connection."
            print(message)
            forward(writer, "Server", message)
            break
    writers.remove(writer)
    writer.close()


async def main():
    server = await asyncio.start_server(
        handle, '127.0.0.1', 8888)
    addr = server.sockets[0].getsockname()
    print(f'Serving on {addr}')
    async with server:
        await server.serve_forever()

asyncio.run(main())

Клиентский скрипт:

import asyncio

print('please type your name:')
name = input()

async def tcp_echo_client(user):
    reader, writer = await asyncio.open_connection(
        '127.0.0.1', 8888)
    message = input()
    usermsg = user+'> '+message
    writer.write(usermsg.encode())

    data = await reader.read(100)
    print(f'{data.decode()!r}')

while True:
    asyncio.run(tcp_echo_client(name))

Вывод выглядит так:

Serving on ('127.0.0.1', 8888)
('127.0.0.1', 53388) is connected !!!!

... если клиент подключается, но если я что-то набираю в клиенте, ничего не происходит.

...