Qt Quick WebGL Streaming是一项技术,任何 Qt Quick(“QML”)应用程序都可以通过该技术向通过 Web 浏览器连接的用户显示其用户界面。您所要做的就是在主机上启动应用程序,如下所示:
\n./my-qml-program -platform webgl:port=8080\nRun Code Online (Sandbox Code Playgroud)\n这是可行的,但受到设计的限制,因此只有一个用户可以同时连接并查看用户界面。为此,他们引用了用户输入、查询 GPU 和安全性方面的问题(来源)。
\n最初,Qt 开发人员希望通过从一个进程提供多个窗口来支持 WebGL 流中的多个用户:
\n\n\n如何支持并发?就像每个连接都有它自己的 QGuiApplication,还是只有一个?[\xe2\x80\xa6] 您创建一个 QGuiApplication 和不同的窗口。当新客户端连接到 HTTP 服务器时,会有一个信号进行通知。当信号发出时,您创建一个不同的 QWindow。窗口是独立的(来源)
\n
然而现在,开发人员希望通过为每个用户启动一个进程来支持 WebGL 流中的多个用户。
\n\n\n\n
\n- 我们正在努力将 HTTP 服务器与插件解耦
\n- 将提供专用的 HTTP 服务器应用程序\n
\n\n
\n- 不是在同一进程中运行所有用户,而是为每个用户生成一个新进程
\n- 新进程将处理网络套接字
\n(来源)
\n
“将 HTTP 服务器与插件解耦”意味着将其替换为 QHttpServer:
\n\n\n我为这个 [QHttpServer] 模块计划了一些用例:更改 WebGL 插件中当前的嵌入式 Web 服务器(和 WebSockets),以便您可以轻松地基于该插件创建自己的自定义解决方案。(来源)
\n
到目前为止,尚未实施任何解决方案。在 Qt WebGL 流中实现对多个用户的支持的最简单方法是什么,而无需等待 Qt 来实现?
\n这是使用负载均衡器的解决方案Pen 的解决方案,使 Qt 应用程序可以通过 WebGL 流同时供多个用户访问。它将传入连接转发到同一主机上运行的多个 Qt 进程之一,每个进程都运行自己的嵌入式 Web 服务器。这种转发正是负载均衡器的工作,只是它通常将连接分发到多个主机。
\n警告:在我的测试中,Qt 5.12.3 中的 WebGL 流传输速度足够快,仅可在本地网络中实际使用,而不能在互联网上使用。所以你不能用它来“廉价地将 Qt 应用程序转换为 Web 应用程序”。
\n这些说明适用于 Ubuntu 19.10、20.04 和其他基于 Debian 的发行版。
\n在您的 Web 主机上安装 Qt 应用程序。
\n在您的虚拟主机上安装 Qt WebGL 平台插件。例如,它不包含在 Ubuntu 19.10 发行版中。在这种情况下,您必须自己编译并安装它。在 Ubuntu Linux 下,结果应该是以下文件:
\n/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqwebgl.so\nRun Code Online (Sandbox Code Playgroud)\n启动 Qt 应用程序的多个进程。每个端口都应该通过 Qt WebGL 流服务一个端口。这里我们启动三个进程,但是您可以根据您的记忆启动任意多个进程。
\nnohup myapplication -platform webgl:port=8080 &\nnohup myapplication -platform webgl:port=8081 &\nnohup myapplication -platform webgl:port=8082 &\nRun Code Online (Sandbox Code Playgroud)\n安装负载平衡器Pen。
\nsudo apt install pen\nRun Code Online (Sandbox Code Playgroud)\n启动负载均衡器。请注意,随着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最多仅将一个客户端连接到一个进程。
pen 80 localhost:8080:1:1 localhost:8081:1:1 localhost:8082:1:1\nRun Code Online (Sandbox Code Playgroud)\n测试设置。http://example.com/要进行测试,请从多个设备访问关联的 URL 。您应该在每台设备上获得该应用程序的一个进程。无法在同一设备上的两个并行浏览器选项卡中看到两个进程 \xe2\x80\x93pen然后会尝试将第二个此类选项卡连接到与第一个选项卡相同的 Qt 进程,因为请求来自相同的 IP 地址。结果,您会在第二个选项卡中看到一个旋转的轮子,因为 Qt 进程只允许每个 WebGL 流有一个连接。
该解决方案可以通过在客户端连接后仅按需启动 Qt 进程来进一步改进。这应该可以通过systemd 套接字激活来实现。
\n