使用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")
答案 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