Я пытался написать простой скрипт чата с 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 !!!!
... если клиент подключается, но если я что-то набираю в клиенте, ничего не происходит.