asyncio socket Как можно с помощью asyncio "поместить" подключившегося клиента в класс
Имею код в котором каждого подключившегося должно было бы помещать в отдельную функцию и обрабатывать их асинхронно, но я захотел включить всё в класс и сразу же из за self стала выскакивать ошибка - TypeError: handle_client() missing 1 required positional argument: 'writer'.
import asyncio, socket
class UserConnect:
# async def __init__(self, reader, writer):
# self.reader = reader
# self.writer = writer
async def handle_client(self, reader, writer):
request = None
while request != 'quit':
request = (await reader.read(255)).decode('utf8')
print(request)
response = str(request) + '\n'
writer.write(response.encode('utf8'))
await writer.drain()
writer.close()
async def run_server():
server = await asyncio.start_server(UserConnect.handle_client, 'localhost', 15557)
async with server:
await server.serve_forever()
asyncio.run(run_server())
Как можно это исправить?
Ответы (1 шт):
Автор решения: Roman Konoval
→ Ссылка
Как вариант можно внести метод start_server в класс UserConnect:
import asyncio, socket
class UserConnect:
# тут все как раньше
async def start_server(self, host, port):
return await asyncio.start_server(self.handle_client, host, port)
async def run_server():
userConnect = UserConnect()
server = await userConnect.start_server('localhost', 15557)
async with server:
await server.serve_forever()
Или можно добавить метод serve_forever и делать все там:
class UserConnect:
def __init__(self, host, port):
self.host = host
self.port = port
async def handle_client(self, reader, writer):
...
async def serve_forever(self):
server= await asyncio.start_server(self.handle_client, self.host, self.port)
async with server:
await server.serve_forever()
async def run_server():
userConnect = UserConnect('localhost', 15557)
await userConnect.serve_forever()