python asyncio.start_server() .Почему после одного ответа сервак отключает пользователя?
Писал сервер для чата при помощи модуля asyncio, но после ответа клиенту сервак отключал пользователя. Как это пофиксить?
версия python 3.8.0
import asyncio
import socket
import json
class Server():
def __init__(self,host,port):
self.host = host
self.port = port
self.clients = {}
async def start_server(self):
server = await asyncio.start_server(self.accept_conection,
self.host,self.port,
family = socket.AF_INET,
flags = socket.SOCK_DGRAM)
await server.serve_forever()
async def accept_conection(self,reader,writer):
addr = writer.get_extra_info('peername')
print(addr)
sock = reader._transport._sock
response = await self.read_response(reader)
print(response)
if response.decode():
data = json.loads(response)
self.clients[addr] = data['nick']
await self.broadcast_response(sock,data['msg'])
async def read_response(self,reader):
while True:
request = await reader.read(1024)
if request:
return request
else:
return None
async def broadcast_response(self,sock,msg):
for client in self.clients:
print(self.clients[client])
response = f"{self.clients[client]}:{msg}"
sock.sendto(bytes(response,'utf8'),client)
self.clients.pop(client)
if __name__ == "__main__":
server = Server('localhost',5000)
asyncio.run(server.start_server())
Ответы (1 шт):
Автор решения: ooser
→ Ссылка
Для тех у кого еще имеется такой вопрос. Ответ кроется в зацикливании и ожидании данных, пока не закроется соединение. Собственно говоря, автор вопроса решил задачу, только не отметил его.
async def read_response(self,reader):
while True:
request = await reader.read(1024)
if request:
return request
else:
return None