【问题标题】:How to get the "pong" response on "ping" call using Python websockets library?如何使用 Python websockets 库获取“ping”调用的“pong”响应?
【发布时间】: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 控制帧。

标签: python websocket ping


【解决方案1】:

如果你想等待pong,你应该await它:

pong_waiter = await ws.ping()
await pong_waiter

如果您希望 pong 包含自定义负载,您很可能可以通过在完成后调用 result()pong_waiter Future 获取它。

【讨论】:

  • 我已经执行了你提出的两行代码。之后我执行了“pong_waiter.result()”。这没有返回任何东西。
  • 嗯,这只是一个标准的Future。您可以使用该 API 查询它。我假设如果result() 没有返回任何内容,则pong 不包含有效负载。
猜你喜欢
  • 2020-08-28
  • 2014-06-07
  • 2017-12-05
  • 2016-10-08
  • 2017-06-12
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
相关资源
最近更新 更多