在回调之外按需发送 websocket 消息?

Posted

技术标签:

【中文标题】在回调之外按需发送 websocket 消息?【英文标题】:Send websocket messages on demand, outside of callbacks? 【发布时间】:2016-03-01 18:47:10 【问题描述】:

我有一个用 Python 编写的玩具视频游戏引擎的后端。它在我的服务器上以连续的游戏循环运行。我希望它能够通过 websockets 向网络浏览器客户端发送消息。

但是,在我看来,websockets 普遍仅限于仅发送回调信息。我尝试使用 Python 的 Autobahn websockets 库,但是当服务器运行时,它运行在一个阻塞循环中,所以你甚至不能与它交互——你只能在回调中提前定义它的行为。

我只想能够实例化一种 MyWebsocketNetwork,它将在后台运行其服务器,并能够在我的代码中的任何位置调用 myWebsocketNetwork.sendToAll("my message") 以按需发送我的消息。不在回调中,而是在需要时。同样,我找不到使用 Autobahn(或任何其他库)执行此操作的方法,因为它们都在阻塞 lops 中运行。

由于 websocket 的性质,这通常是不可能的吗?或者有什么方法可以让我在 Python 中按需向我的客户发送 websocket 消息(按需 = 动态和有条件地基于我的游戏循环中发生的事情)。

【问题讨论】:

【参考方案1】:

我不确定我理解你的意思。回调是按需的。听起来您需要在单独的线程中创建 WebSocket。

【讨论】:

这是高速公路特有的,但这是我的问题:我创建了我的客户端,在其中我定义了 onMessage、onConnect 等的行为方式。我以相同的方式定义我的服务器。它们每个都进入一个 asyncio 循环,然后是 loop.run_forever()。所以他们的行为只是预定义的——我如何在外部说“我想任意发送这个消息到服务器,而不是从回调中,而是从拥有这个客户端的外部游戏引擎?” 我对高速公路不太熟悉,但只是想以防万一它对您有所帮助...如果您在 asyncio 循环之外引用了 WebSocket,为什么不能仅仅-ws-reference.send("给客户的东西") ?

以上是关于在回调之外按需发送 websocket 消息?的主要内容,如果未能解决你的问题,请参考以下文章

使用原始 WebSocket 时如何知道消息是不是已成功发送?

如何在 websocket 服务器上向特定用户发送消息

使用Spring STOMP websockets向单个人发送消息

实现websocket 主动消息推送,用laravel+Swoole

在websocket上编写Oracle PL / SQL

微信小程序webSocket多人通信案例