aiohttp.ClientSession + WebSocket

244 views
Skip to first unread message

yaroslav....@gmail.com

unread,
Oct 15, 2016, 9:37:29 PM10/15/16
to aio-libs
Приветствую.
Сервер победил, с клиентом не выходит...
(переделываю с xmlrpc на сокеты)

async def start_client(url):
    session = ClientSession()
    ws = await session.ws_connect(url)
    return ws


async def write(ws):
    while True:
        await asyncio.sleep(1)
        ws.send_str(host_name)


async def read(ws):
    while True:
        msg = await ws.receive()
        print(msg.data)


if __name__ == '__main__':

    loop = asyncio.get_event_loop()
    w_s = loop.run_until_complete(start_client('http://192.168.1.15/farm'))
    tasks = [read(w_s), write(w_s)]
    loop.run_until_complete(asyncio.gather(*tasks))
    # loop.run_forever()

Так не работает, если поместить чтение сокета в корутину start_client - все нормально. Но мне нужно при потере соединения выполнять новое (возможно с другим IP, перед этим выполнять функцию поиска сервера в сети). Плюс, отправку в сокет нужно делать с переодичностью.

Спасибо.

Andrew Svetlov

unread,
Oct 16, 2016, 3:07:29 AM10/16/16
to yaroslav....@gmail.com, aio-libs
1. Почему не работает?
2. Что вы сделал чтобы создавать новое ws соединение и отправлять данные периодически.

P.S. На stackoverflow такие вопросы банят.

--
You received this message because you are subscribed to the Google Groups "aio-libs" group.
To unsubscribe from this group and stop receiving emails from it, send an email to aio-libs+u...@googlegroups.com.
To post to this group, send email to aio-...@googlegroups.com.
Visit this group at https://groups.google.com/group/aio-libs.
To view this discussion on the web visit https://groups.google.com/d/msgid/aio-libs/b36927af-6142-4b04-9823-61189d7b5c2a%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
--
Thanks,
Andrew Svetlov

yaroslav....@gmail.com

unread,
Oct 16, 2016, 1:30:27 PM10/16/16
to aio-libs, yaroslav....@gmail.com
воскресенье, 16 октября 2016 г., 10:07:29 UTC+3 пользователь Andrew Svetlov написал:
1. Почему не работает?
2. Что вы сделал чтобы создавать новое ws соединение и отправлять данные периодически.

P.S. На stackoverflow такие вопросы банят.

1. Понять не могу, ругается:
Unclosed client session
client_session: <aiohttp.client.ClientSession object at 0x000001E5E41C4D68>

2. Создал новое соединение в корутине start_client, получил указатель на ClientWebSocketResponse, передал указатель в корутины для чтения и записи сокета.

Причем, так все прекрасно работает:

async def start_client(loop, url):

    session = ClientSession()
    ws = await session.ws_connect(url)

    loop.create_task(write(ws))


    while True:
        msg = await ws.receive()
        print(msg.data)


async def write(ws):
    while True:
        await asyncio.sleep(1)
        ws.send_str(host_name)


if __name__ == '__main__':

    loop = asyncio.get_event_loop()
    loop.run_until_complete(start_client(loop, 'http://192.168.1.15/farm'))

Если чтение сокета находится в контексте той-же корутины что и его создание - все ок.
Хотя, в предыдущем примере, в корутине чтения сокета ClientWebSocketResponse.closed скажет False, значит он не закрыт.
Блин, что происходит с этим указателем "по-дороге"?

3. Почему банят? Не правильно оформлен вопрос? Я, конечно, нуб и вопросы нубские, мне самому покажутся смешными через n времени, но я стараюсь задавать вопросы, когда "застряну" минимум на сутки, а делать copy-paste не для всех. Мало того, что работает, нужно понять почему.

4. У вас принято давать обратную связь в ветке вопроса, если проблема решена?

Спасибо. 

yaroslav....@gmail.com

unread,
Oct 17, 2016, 6:56:07 AM10/17/16
to aio-libs, yaroslav....@gmail.com
Пока "сколхозил" так:

async def start_client(loop, url):
    session = ClientSession()
    was_connect = False
    try:
        ws = await session.ws_connect(url)
        was_connect = True
        print('Connected to server:', host_ip + ':' + str(host_port))
    except:
        pass
    else:
        send_task = loop.create_task(send_to_server(ws))
        async for msg in ws:
            if msg.type == WSMsgType.TEXT:
                pass
            elif msg.type == WSMsgType.CLOSE:
                break
            elif msg.type == WSMsgType.CLOSED:
                break
            elif msg.type == WSMsgType.ERROR:
                break
        send_task.cancel()
    finally:
        session.close()
        if was_connect:
            print('Disconnected...')
    return


async def send_to_server(ws):

    while True:
        await asyncio.sleep(1)
        ws.send_str(host_name)


async def main(loop):
    url = 'ws://192.168.1.15:30080/farm'

    while True:
        await asyncio.sleep(1)
        print('Connecting to server...')
        session_task = loop.create_task(start_client(loop, url))
        await session_task




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

Не могу разобраться как передать ClientWebSocketResponce.



yaroslav....@gmail.com

unread,
Oct 25, 2016, 1:23:32 AM10/25/16
to aio-libs, yaroslav....@gmail.com
Случайно нашел подтверждение:
https://toster.ru/q/238656 (В комментарии на ответ)
Reply all
Reply to author
Forward
0 new messages