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()
    
→ Ссылка