我遇到了与此python websockets的github问题相同的问题: https://github.com/aaugustin/websockets/issues/367
建议的解决方案虽然对我不起作用。我收到的错误是:
websockets.exceptions.ConnectionClosed:WebSocket连接已关闭:代码= 1006([内部],连接异常关闭),没有原因
这是我的代码:
VERSION BUILD=1005 RECORDER=CR
URL GOTO=https://www.bing.com
EVENT TYPE=CLICK SELECTOR="#sb_form_q" BUTTON=0
EVENTS TYPE=KEYPRESS SELECTOR="#sb_form_q" CHARS="wasddsaw"
我一直在测试它的方法是关闭我的互联网连接,但是经过十秒钟的延迟,它仍然会返回1006错误。
我正在运行Python 3.7和Websockets 7.0。
让我知道您的想法,谢谢!
答案 0 :(得分:2)
我可能迟到了一年,但我刚遇到这个问题。我的html5 websocket客户端上没有连接问题,但是.py测试客户端在一分钟后会崩溃(客户端和服务器也都引发了1006个异常)。作为测试,我开始在客户端发送的每一帧之后await connection.recv()
开始。没有更多的问题。我不需要为.py测试客户端接收数据,但是如果您让它建立起来,显然会导致问题。这也可能是我的Web版本运行良好的原因,因为我正在处理.onmessage
回调。
我非常确定这就是发生此错误的原因。因此,这种仅接收数据的解决方案是一种实际的解决方案,并且不会禁用ping和破坏协议的重要功能。
答案 1 :(得分:1)
所以我找到了解决方法:
当连接关闭时,由于某种原因,它会退出while循环。因此,为了使websocket保持运行,您必须将
resp = await websocket.recv()
使用try ...,除了并拥有
print('Reconnecting')
websocket = await websockets.connect(ws_url)
在异常处理部分。
答案 2 :(得分:0)
我遇到了同样的问题。 挖掘了一段时间后,我发现答案的多个版本要求重新连接,但我认为这不是一条合理的路线,所以我又挖了一些。
启用DEBUG级别的日志记录,我发现python websockets默认发送ping数据包,但未收到响应,导致连接超时。我不确定这是否符合标准,但至少javascript websockets与我的python脚本超时的服务器完全兼容。
解决方法很简单:在connect
中添加另一个kw参数:
websockets.connect(uri, ping_interval=None)
相同的参数也应适用于服务器端功能serve
。
答案 3 :(得分:0)
我遇到了同样的问题。 shinola的解决方案工作了一段时间,但有时仍然会出错。
为解决这个问题,我将连接置于while True:
循环中,并添加了两个单独的try除了块。 consumer
变量是一个处理从websocket连接接收的消息的函数。
async def websocketConnect(uri, payload, consumer):
websocket = await websockets.connect(uri, ssl=True)
await websocket.send(json.dumps(payload))
while True:
if not websocket.open:
try:
print('Websocket is NOT connected. Reconnecting...')
websocket = await websockets.connect(uri, ssl=True)
await websocket.send(json.dumps(payload))
except:
print('Unable to reconnect, trying again.')
try:
async for message in websocket:
if message is not None:
consumer(json.loads(message))
except:
print('Error receiving message from websocket.')
我使用以下方法开始连接:
def startWebsocket(uri, payload, consumer):
asyncio.run(websocketConnect(uri, payload, consumer))
答案 4 :(得分:0)
我认为他们在这里解释了:https://websockets.readthedocs.io/en/stable/faq.html
<块引用>表示TCP连接丢失。因此, WebSocket 连接在没有收到关闭帧的情况下被关闭,这导致 异常。
您可以捕获并处理 ConnectionClosed 以防止它被 已登录。
长期连接丢失的原因有多种:
最终用户设备往往会经常失去网络连接,并且 不可预测,因为它们可以移出无线网络覆盖范围, 拔掉有线网络,进入飞行模式,进入 睡觉等
HTTP 负载平衡器或代理未配置为长期存在 连接可能会在很短的时间后终止连接, 通常为 30 秒。
答案 5 :(得分:-1)
我通过使用 hypercorn
uvicorn
表格解决了这个问题。
hypercorn app:app