16

我正在进行一项科学实验,大约有两打测试人员互相玩回合制游戏。现在,它是一个带有 WSGI 接口的 Python Web 应用程序。我想通过 websockets 来增加可用性:当所有玩家完成他们的回合时,我想通知所有客户端更新他们的状态。现在,每个人要么等待转弯超时,要么不断重新加载并等待“转弯仍在进行中”错误消息不再出现(忙于等待,有效)。

我通读了多个 websocket 库的文档,了解 websockets 的工作原理,但我不确定混合 WSGI 和 websockets 的架构:我可以在同一个进程中拥有 websockets 和 WSGI 服务器吗(如果可以,如何,使用任何 websockets 库)并且只my_websocket.send_message()从 WSGI 处理程序调用,或者我应该有一个单独的 websockets 服务器并做一些 IPC?还是我根本不应该混合它们?

编辑,6 个月后:我最终启动了一个单独的 websockets 服务器进程(使用 Autobahn),而不是将它与 WSGI 服务器集成。原因是,将它们两者分开更容易和更清晰,并且从 WSGI 进程(服务器到服务器通信)与 websockets 服务器进行对话是直接的,并且在第一次尝试时使用websocket-client进行了工作。

4

2 回答 2

14

这是一个可以满足您要求的示例:

它运行一个 WSGI Web 应用程序(在这种情况下基于 Flask,但可以是任何符合 WSGI 的)加上一个 WebSocket 服务器,在 1 个服务器和 1 个端口下。

您可以从 Web 处理程序中发送 WS 消息。Autobahn 还在 WebSocket 之上提供了 PubSub,这极大地简化了通知的发送(通过WampServerProtocol.dispatch),就像您的情况一样。

披露:我是 Autobahn 的作者,为 Tavendo 工作。

于 2012-10-30T11:49:46.090 回答
2

但我不确定混合 WSGI 和 websockets 的架构

我做到了

使用WSocket

简单的 WSGI HTTP + Websocket 服务器、框架、中间件和应用程序。

包括

  • 包括服务器(WSGI) - 适用于任何 WSGI 框架
  • 中间件 - 为任何 WSGI 框架添加 Websocket 支持
  • 框架 - 简单的 Websocket WSGI Web 应用程序框架
  • App - 用于 Websocket 通信的基于事件的应用程序 当使用外部服务器时,某些客户端(如 Firefox)需要http 1.1服务器。用于中间件、框架、应用程序
  • 处理程序 - 向wsgiref添加 Websocket 支持(python 内置 WSGI 服务器)
  • 客户 - 即将推出...

共同特征

  • 只有一个文件少于 1000 行
  • 支持 websocket 子协议
  • 支持 websocket 消息压缩(如果客户要求可以工作)
  • 接收和发送 pong 和 ping 消息(带有自动 pong 发送器)
  • 接收和发送二进制或文本消息
  • 适用于带或不带掩码的消息
  • 支持关闭消息
  • 自动和手动关闭

使用 Bottle Web 框架和 WSocket 中间件的示例

from bottle import request, Bottle
from wsocket import WSocketApp, WebSocketError, logger, run
from time import sleep

logger.setLevel(10)  # for debugging

bottle = Bottle()
app = WSocketApp(bottle)
# app = WSocketApp(bottle, "WAMP")

@bottle.route("/")
def handle_websocket():
    wsock = request.environ.get("wsgi.websocket")
    if not wsock:
        return "Hello World!"

    while True:
        try:
            message = wsock.receive()
            if message != None:
                print("participator : " + message)
                
            wsock.send("you : "+message)
            sleep(2)
            wsock.send("you : "+message)
            
        except WebSocketError:
            break
            
run(app)
于 2020-11-20T17:10:06.147 回答