如何使用 Python websockets 库获取“ping”调用的“pong”响应?
Posted
技术标签:
【中文标题】如何使用 Python websockets 库获取“ping”调用的“pong”响应?【英文标题】:How to get the "pong" response on "ping" call using Python websockets library? 【发布时间】:2020-03-05 08:19:58 【问题描述】:我有一个订阅网络套接字的应用程序,并且不时从它那里接收一些信息。在某些情况下,我的应用程序可能会在相对较长的时间内没有收到任何东西。在那种情况下,我可能会怀疑 web-socket 已经“死”了。但是,也可能是 web-socket 没有任何东西要发送,我只需要等待更长时间。
因此,在这种情况下,我不想猜测延迟的原因是什么。我只想“主动”询问网络套接字是否还活着。我了解到可以使用“ping”来完成,但我不确定它是如何工作的。
例如,我可以执行以下操作:
pong_waiter = await ws.ping()
但是我应该如何处理这个对象?我想当网络套接字还活着时我需要看到一个“pong”字符串,但我在哪里可以看到它?返回这个字符串是什么?
添加
如果我执行:
pong_waiter = await ws.ping()
await pong_waiter
我什么也没得到。之后我也执行:
pong_waiter.result()
它也不返回任何内容。但我知道 web-socket 是活跃的(我仍在从中获取信息)。
添加了 2 个
如果我执行:
pong_waiter
我明白了:
<Future finished result=None>
那么,“pong”在哪里?
【问题讨论】:
不确定我是否理解您的要求。没有发送文字乒乓球。一个 pong 消息只是一个操作码为0xA
的控制帧,可以选择后跟一个有效负载。
您的pong_waiter
Future
成功完成这一事实表明您已收到一个pong 控制帧以响应您的ping 控制帧。
【参考方案1】:
如果你想等待pong
,你应该await
它:
pong_waiter = await ws.ping()
await pong_waiter
如果您希望 pong
包含自定义负载,您很可能可以通过在完成后调用 result()
从 pong_waiter
Future
获取它。
【讨论】:
我已经执行了你提出的两行代码。之后我执行了“pong_waiter.result()”。这没有返回任何东西。 嗯,这只是一个标准的Future
。您可以使用该 API 查询它。我假设如果result()
没有返回任何内容,则pong
不包含有效负载。以上是关于如何使用 Python websockets 库获取“ping”调用的“pong”响应?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 SSL 创建 python websocket 并在其中使用 cookie?
如何使用 Python(带有 websockets 的服务器)和 JavaScript(客户端)接收 JSON 数据
当python中的连接失败时如何重新连接到websocket
如何在没有 Flask 的 Heroku 上托管 websocket 应用程序 python 服务器?