如何通过 Qt WebGL 流向多个用户提供 Qt 应用程序?

tan*_*ius 4 webserver qt qml

Qt Quick WebGL Streaming是一项技术,任何 Qt Quick(“QML”)应用程序都可以通过该技术向通过 Web 浏览器连接的用户显示其用户界面。您所要做的就是在主机上启动应用程序,如下所示:

\n
./my-qml-program -platform webgl:port=8080\n
Run Code Online (Sandbox Code Playgroud)\n

这是可行的,但受到设计的限制,因此只有一个用户可以同时连接并查看用户界面。为此,他们引用了用户输入、查询 GPU 和安全性方面的问题(来源)。

\n

最初,Qt 开发人员希望通过从一个进程提供多个窗口来支持 WebGL 流中的多个用户:

\n
\n

如何支持并发?就像每个连接都有它自己的 QGuiApplication,还是只有一个?[\xe2\x80\xa6] 您创建一个 QGuiApplication 和不同的窗口。当新客户端连接到 HTTP 服务器时,会有一个信号进行通知。当信号发出时,您创建一个不同的 QWindow。窗口是独立的(来源

\n
\n

然而现在,开发人员希望通过为每个用户启动一个进程来支持 WebGL 流中的多个用户。

\n
\n
    \n
  • 我们正在努力将 HTTP 服务器与插件解耦
  • \n
  • 将提供专用的 HTTP 服务器应用程序\n
      \n
    • 不是在同一进程中运行所有用户,而是为每个用户生成一个新进程
    • \n
    • 新进程将处理网络套接字
    • \n
    \n
  • \n
\n

来源)

\n
\n

“将 HTTP 服务器与插件解耦”意味着将其替换为 QHttpServer:

\n
\n

我为这个 [QHttpServer] 模块计划了一些用例:更改 WebGL 插件中当前的嵌入式 Web 服务器(和 WebSockets),以便您可以轻松地基于该插件创建自己的自定义解决方案。(来源

\n
\n

到目前为止,尚未实施任何解决方案。在 Qt WebGL 流中实现对多个用户的支持的最简单方法是什么,而无需等待 Qt 来实现?

\n

tan*_*ius 5

这是使用负载均衡器的解决方案Pen 的解决方案,使 Qt 应用程序可以通过 WebGL 流同时供多个用户访问。它将传入连接转发到同一主机上运行的多个 Qt 进程之一,每个进程都运行自己的嵌入式 Web 服务器。这种转发正是负载均衡器的工作,只是它通常将连接分发到多个主机。

\n

警告:在我的测试中,Qt 5.12.3 中的 WebGL 流传输速度足够快,仅可在本地网络中实际使用,而不能在互联网上使用。所以你不能用它来“廉价地将 Qt 应用程序转换为 Web 应用程序”。

\n

指示

\n

这些说明适用于 Ubuntu 19.10、20.04 和其他基于 Debian 的发行版。

\n
    \n
  1. 在您的 Web 主机上安装 Qt 应用程序。

    \n
  2. \n
  3. 在您的虚拟主机上安装 Qt WebGL 平台插件。例如,它不包含在 Ubuntu 19.10 发行版中。在这种情况下,您必须自己编译并安装它。在 Ubuntu Linux 下,结果应该是以下文件:

    \n
    /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqwebgl.so\n
    Run Code Online (Sandbox Code Playgroud)\n
  4. \n
  5. 启动 Qt 应用程序的多个进程。每个端口都应该通过 Qt WebGL 流服务一个端口。这里我们启动三个进程,但是您可以根据您的记忆启动任意多个进程。

    \n
    nohup myapplication -platform webgl:port=8080 &\nnohup myapplication -platform webgl:port=8081 &\nnohup myapplication -platform webgl:port=8082 &\n
    Run Code Online (Sandbox Code Playgroud)\n
  6. \n
  7. 安装负载平衡器Pen

    \n
    sudo apt install pen\n
    Run Code Online (Sandbox Code Playgroud)\n
  8. \n
  9. 启动负载均衡器。请注意,随着pen 80 \xe2\x80\xa6它的启动,用户只需http://example.com/在其 Web 浏览器中输入简单的 URl 即可访问该应用程序。如果端口 80 已被使用,您可以选择任何其他端口(例如9090),使用 启动负载均衡器pen 9090 \xe2\x80\xa6,然后让用户访问类似 的 URL http://example.com:9090/。另请注意:1:1列出的每个服务器进程的后缀,告诉pen最多仅将一个客户端连接到一个进程。

    \n
    pen 80 localhost:8080:1:1 localhost:8081:1:1 localhost:8082:1:1\n
    Run Code Online (Sandbox Code Playgroud)\n
  10. \n
  11. 测试设置。http://example.com/要进行测试,请从多个设备访问关联的 URL 。您应该在每台设备上获得该应用程序的一个进程。无法在同一设备上的两个并行浏览器选项卡中看到两个进程 \xe2\x80\x93pen然后会尝试将第二个此类选项卡连接到与第一个选项卡相同的 Qt 进程,因为请求来自相同的 IP 地址。结果,您会在第二个选项卡中看到一个旋转的轮子,因为 Qt 进程只允许每个 WebGL 流有一个连接。

    \n
  12. \n
\n

改进

\n

该解决方案可以通过在客户端连接后仅按需启动 Qt 进程来进一步改进。这应该可以通过systemd 套接字激活来实现。

\n