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

Posted

技术标签:

【中文标题】如何通过 Qt WebGL 流向多个用户提供 Qt 应用程序?【英文标题】:How to serve a Qt application to multiple users via Qt WebGL streaming? 【发布时间】:2020-08-11 15:44:11 【问题描述】:

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

./my-qml-program -platform webgl:port=8080

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

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

如何支持并发?就像每个连接都有自己的 QGuiApplication,还是只有一个? […] 你创建了一个 QGuiApplication 和不同的窗口。当新客户端连接到 HTTP 服务器时,会有一个信号通知。当信号发出时,您将创建一个不同的 QWindow。窗口是独立的(source)

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

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

(source)

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

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

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

【问题讨论】:

【参考方案1】:

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

警告:在我的测试中,Qt 5.12.3 中的 WebGL 流式传输速度足够快,只能在本地网络中实际使用,而不是通过 Internet。所以你不能用它来“廉价地将 Qt 应用程序转换成 Web 应用程序”。

说明

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

    在您的网络主机上安装 Qt 应用程序。

    在您的 Web 主机上安装 Qt WebGL 平台插件。 例如,它不包含在 Ubuntu 19.10 发行版中。在这种情况下,您必须compile and install it yourself。在 Ubuntu Linux 下,结果应该是以下文件:

    /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqwebgl.so
    

    启动 Qt 应用程序的多个进程。每个进程都应为 Qt WebGL 流式传输提供一个端口。这里我们启动三个进程,但您可以根据自己的记忆启动任意多个进程。

    nohup myapplication -platform webgl:port=8080 &
    nohup myapplication -platform webgl:port=8081 &
    nohup myapplication -platform webgl:port=8082 &
    

    安装负载均衡器Pen。

    sudo apt install pen
    

    启动负载均衡器。请注意,使用pen 80 … 启动它,以便用户只需在他们的网络浏览器中输入一个简单的URL,例如http://example.com/ 即可访问该应用程序。如果端口 80 已被使用,您可以选择任何其他端口(例如,9090),使用 pen 9090 … 启动负载均衡器,然后让用户访问类似 http://example.com:9090/ 的 URL。还要注意列出的每个服务器进程的:1:1 后缀,告诉pen 最多只能将一个客户端连接到一个进程。

    pen 80 localhost:8080:1:1 localhost:8081:1:1 localhost:8082:1:1
    

    测试设置。要进行测试,请从多个设备访问关联的 URL http://example.com/。您应该在每台设备上获得应用程序的一个进程。在 same 设备上的两个并行浏览器选项卡中不可能看到两个进程——pen 然后会尝试将第二个这样的选项卡连接到与第一个选项卡相同的 Qt 进程,因为请求来了来自同一个 IP 地址。结果,您会在第二个选项卡中看到一个旋转的***,因为 Qt 进程只允许一个连接用于 WebGL 流。

改进

这个解决方案可以通过仅在客户端连接后按需启动 Qt 进程来进一步改进。 systemd socket activation 应该可以做到这一点。

【讨论】:

以上是关于如何通过 Qt WebGL 流向多个用户提供 Qt 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何安装 Qt WebGL 插件

如何通过 qt 设计器创建 QSplitter ui 类?

pyqt5通过qt designer 设计方式连接多个UI图形界面

Qt中的鼠标事件

QT不同平台对线程如何支持和实现

Web 界面与 Qt 用户界面相同