如何通过Qt-WebGL流媒体为多个用户提供Qt应用程序



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

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

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

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

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

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

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

(来源(

"将HTTP服务器与插件"解耦";意味着用QHttpServer:替换它

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

到目前为止,还没有实现任何解决方案。在Qt-WebGL流媒体中实现对多个用户的支持,而不等待Qt实现这一点,最简单的方法是什么?

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

注意:在我的测试中,Qt 5.12.3中的WebGL流媒体足够快,只能在本地网络中使用,而不能在互联网上使用。所以你不能用它来";将Qt应用程序转换成廉价的网络应用程序";。

说明书

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

  1. 在web主机上安装Qt应用程序

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

    /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqwebgl.so
    
  3. 启动Qt应用程序的多个进程每个端口应为一个端口提供Qt WebGL流。在这里,我们开始三个过程,但你可以开始尽可能多的适合你的记忆。

    nohup myapplication -platform webgl:port=8080 &
    nohup myapplication -platform webgl:port=8081 &
    nohup myapplication -platform webgl:port=8082 &
    
  4. 安装负载平衡器笔

    sudo apt install pen
    
  5. 启动负载平衡器请注意,对于pen 80 …,它是启动的,因此用户只需在其web浏览器中输入一个简单的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
    
  6. 测试设置要进行测试,请从多个设备访问关联的URLhttp://example.com/。每个设备都应该为您提供一个申请流程。不可能在同一设备上的两个并行浏览器选项卡中看到两个进程——pen会尝试将第二个这样的选项卡连接到与第一个选项卡相同的Qt进程,因为请求来自相同的IP地址。因此,您会在第二个选项卡中看到一个旋转的轮子,因为Qt进程只允许WebGL流每个连接一个。

改进

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

最新更新