如何使用Python Websockets库在"ping"调用时获得"pong"响应?

5
我有一个应用程序订阅了一个websocket,它不时地从中接收一些信息。在某些情况下,我的应用程序可能会相对较长时间内没有接收到任何信息。在这种情况下,我可能会怀疑websocket已经“死亡”。但是,也可能是websocket没有任何东西可发送,我只需要等待更长时间。
因此,在这种情况下,我不想猜测延迟的原因。我只想“积极”询问websocket是否仍然活着。我了解到可以用“ping”来做到这一点,但我不确定具体如何操作。
例如,我可以执行以下操作:
pong_waiter = await ws.ping()

但我该如何处理这个对象呢?我猜当 WebSocket 存活时我需要看到一个 "pong" 字符串,但我在哪里能看到它呢?返回这个字符串的是什么呢?

添加

如果我执行:

pong_waiter = await ws.ping()
await pong_waiter

我什么也没得到。之后我还执行了以下命令:

pong_waiter.result()

它也没有返回任何东西。但我知道什么是Web Socket在连接状态(我仍然从中获取信息)。
添加2: 如果我执行:
pong_waiter

I get:

<Future finished result=None>

那么,“pong”在哪里呢?


不确定我理解你的问题。没有发送文字“pong”。 pong消息只是一个带有操作码为0xA的控制帧,可选择跟随有效载荷。 - Robby Cornelissen
你的 pong_waiter Future 成功完成的事实表明,你已经收到了一个 pong 控制帧作为对你的 ping 控制帧的响应。 - Robby Cornelissen
1个回答

3

如果你想等待 pong,你应该使用 await

pong_waiter = await ws.ping()
await pong_waiter

如果你期望pong包含自定义有效载荷,你可以通过在pong_waiterFuture完成后调用result()来获取它。


我执行了你建议的两行代码。之后,我执行了 "pong_waiter.result()"。但它没有返回任何内容。 - Roman
嗯,这只是一个标准的 Future。您可以使用该 API 对其进行查询。我假设如果 result() 没有返回任何内容,则 pong 不包含有效载荷。 - Robby Cornelissen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接