如何使用 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 服务器?

如何使用 Python websockets 库获取“ping”调用的“pong”响应?

利用Python爬虫获取招聘网站职位信息