client24
@client24

Как читать socket с помощью asyncio?

Подскажите как правильно сделать)
Уже много вопросов по этому поводу от меня)
но я не сдаюсь

Вот пример кода
import socket, ssl
import asyncio

class MySocket(object):
    def __init__(self):
        self.__host = 'mysite.com'
        self.__port = 4637
        self.__recv_handler = None
        sock = socket.socket(socket.AF_INET)
        context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH)
        self.__conn = context.wrap_socket(sock, server_hostname=self.__host)


    def connect(self):
        self.__conn.connect((self.__host, self.__port))
        self.__recv_handler = asyncio.ensure_future(self.__recive())

    def send(self, data):
        self.__conn.write(data.encode())

    async def __recive(self):
        while True:
            data = await self.__conn.recv()
            data = data.decode('utf-8')
            print('<< ' + data)


async def main():
    my_sock = MySocket()
    print('Start')
    my_sock.connect()
    my_sock.send('ping')
    asyncio.sleep(0.2)
    my_sock.send('ping')
    asyncio.sleep(4)
    my_sock.send('ping')
    asyncio.sleep(0.1)
    my_sock.send('ping')


if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())


Всегда получаю ошибку

TypeError: object bytes can't be used in 'await' expression

я понимаю что это за ошибка но не знаю как сделать по другому
много гуглил но ответа не нашел
наверно что то не так искал
  • Вопрос задан
  • 6091 просмотр
Решения вопроса 2
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
В asyncio есть несколько слоев абстракций более высокого уровня, лучше работать с ними. Но если уж хочется работать непосредственно с сокетами, то стоит учесть, что socket.recv() - это блокирующийся метод, а потому использовать его с await не выйдет. Необходимо использовать асинхронную обёртку для него:
data = yield from asyncio.get_event_loop().sock_recv(self.__conn, 256)
Ответ написан
adugin
@adugin Куратор тега Python
Необходимо завернуть recv() в корутину, как вариант - в asyncio.wait_for().
Пример кода: При как обстоятельствах закрывается поток в Python?
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы