aiohttp Websocket在连接到某些websocket服务器时不会关闭

时间:2017-02-14 16:27:48

标签: python websocket aiohttp

使用Python v3.5或v3.6 websocket客户端在连接到某些websocket服务器时没有关闭。下面的示例代码显示连接到wss://echo.websocket.org时进程正常,但在连接到wss:/stream.pushbullet.com时无法断开连接。

有人能看出有什么区别吗?它几乎不应该与服务器及其行为(或可能是行为不端)有任何关系。

import asyncio
import aiohttp

# Code: http://pastebin.com/G5sfpQG2
# Closing the echo.websocket.org connection works as expected
# Closing the stream.pushbullet.com connection hangs

async def run():
    session = aiohttp.ClientSession()
    API_KEY = "RrFnc1xaeQXnRrr2auoGA1e8pQ8MWmMF"  # (OK to have here)
    async with session.ws_connect('wss://stream.pushbullet.com/websocket/' + API_KEY) as ws:
    # async with session.ws_connect("wss://echo.websocket.org") as ws:
        ws.send_json({"hello": "world"})

        async def _timeout():
            await asyncio.sleep(2)
            print('closing ... ', end="", flush=True)
            await ws.close()
            print('... closed. Should see "broke out of ..." messages next')

        asyncio.get_event_loop().create_task(_timeout())

        async for ws_msg in ws:
            print("ws_msg:", ws_msg)

        print("broke out of async for loop")
    print("broke out of async with")
    session.close()

loop = asyncio.get_event_loop()
loop.run_until_complete(run())
print("goodbye")

2 个答案:

答案 0 :(得分:1)

虽然用户已经回答了问题,但我发现服务器没有关闭套接字的问题,在aiohttp 2.0上仍然很普遍。

很多时候这也是服务器的问题!调试后发现一些服务器根据协议没有关闭ssl连接。对于此类服务器,在创建connector对象时添加以下参数通常可以完成工作。

force_close=True, enable_cleanup_closed=True

为可能在2.0上仍然面临此问题的用户添加此信息。

答案 1 :(得分:0)

叹息 aiohttp的1.3.0版修复此问题。我会假设这是一个错误。我在v1.2.0上。

-Rob