浅谈QWebChannel、QWebChannelAbstractTransport、QWebSocketServer、QWebSocket用法及之间关系

news2024/11/25 12:22:37

1.前言

在现实业务中,经常遇到这样的需求:一端采用web形式开发的,如:客户端采用html、javascript、nodejs开发;而另一端采用C++开发,如:Qt开发的服务端。web页面端需和Qt开发的服务端进行通信、数据交互。即如下图所示模型:

图1:服务端、客户端模式

在这种c/s和b/s混合的模式中,c/s、b/s怎样进行数据交互?它们是怎样进行通信的呢?Qt的QWebChannel、QWebChannelAbstractTransport、QWebSocketServer、QWebSocket这几个类正是为了解决此需求而提出的。

2.QWebSocketServer简介

按照Qt官方助手Qt Assistant对这个类的描述,该类实现一个基于Web的socket套接字服务端。该类模型化了QTcpServer类,其行为和QTcpServer类完全相同,所以,如果知道QTcpServer类用法,就知道了QWebSocketServer用法。该类使得接受一个来自web端的连接变为可能。你可以为该类指定一个端口或让该类自动选择一个端口。你能用该类在某个特定的IP或在整个机器上调用listen()函数去监听即将到来的web端连接。

当每次有新的客户端连接到以本类对象为服务端时,newConnection()信号就会发射。调用nextPendingConnection()函数接受到来的连接,之后该函数返回 一个连接状态的QWebSocket对象。之后,你可以用QWebSocket对象和这个连接的客户端进行通信。

如果某个错误发生,则serverError()返回错误的类型,errorString() 函数返回一个人类可读的描述错误的字符串。当监听连接时,服务端用于监听的IP地址和端口可以通过serverAddress() 、serverPort()函数获取到。调用close()函数使QWebSocketServer停止监听。

3.QWebSocket简介

QWebSocket类实现了同web端进行TCP通信的套接字。该类在一个单一的TCP连接上实现全双工(即:在同一链路上,既能发送数据又能接收数据)的通信机制。 该类模型化了QAbstractSocket类。

4.QWebChannel简介

QWebChannel类向html页面客户端暴露QObject类对象。该类填补了C++应用程序和HTML/JavaScript应用程序之间的技术空白。通过将一个从QObject类派生出的对象发布到QWebChannel类对象上,且在HTML端用 qwebchannel.js ,就可以透明地访问QObject类对象的属性和其pulic类型槽函数和方法,而不需人工传递消息或序列化数据。C++端属性的更新和信号的发射会自动地传送到潜在的、正在运行的远程HTML客户端。在HTML客户端,将会为发布的C++的QObject对象创建一个JavaScript对象。该JavaScript对象镜像、映射了C++端的QObject对象的API,因此调用这些API就相当于调用了C++端的QObject对象的API。

基于C++ 的QWebChannel 类的API,使得同任何HTML表示的客户端进行通信和数据交互变为可能,且能运行在本地或远程机器。唯一的限制是:HTML客户端必须支持qwebchannel.js文件中涉及的JavaScript的特性,例如:应能同任何现代的、支持html的浏览器进行交互或者支持单独的JavaScript运行时库,如:node.js.

5.QWebChannelAbstractTransport

该类是C++ 端QWebChannel 类和HTML/JS表示的客户端之间的通信通道即链路。该类是一个抽象类,必须被子类化后才能使用。QWebChannel 类的使用者必须实现这个类相关接口,且要为每个HTML/JS客户端实现一个QWebChannelAbstractTransport类的实例且连接到QWebChannel 类表示的服务端。

6.这几个类之间的关系

这几个类在图1表示的通信模型、数据交互中各司其责。如前文所示,总结各类职责如下:

  1. QWebSocketServer构建基于TCP通信的一个服务端套接字,等待HTML/JS客户端连接。

  1. 当在a步骤提到的HTML/JS客户端连接成功时,就会生成一个QWebSocket类对象。

  1. 当a、b步骤都成功时,QWebSocketServer表示的服务端就可以和QWebSocket表示HTML/JS客户端进行数据通信、数据交互。但这样数据通信、数据交互不是很方便,其不方便表现在:通信链路和交互的数据无法用类表示,使用时显得很零散,无法组织数据。QWebChannelAbstractTransport、QWebChannel正是为解决此问题而提出的,前者封装通信链路;后者封装C++、Qt实现的服务器端的属性和接口,之后HTML/JS客户端就可以通过QWebChannelAbstractTransport实现的通信链路调用服务器端属性和接口。

一般地,对于图1所示客户端和服务端交互的时序图类似如下:

图2:时序图

7.工程实战

下面的XX.XX.XX为Qt的版本号,如:5.14.1。下面总结的都是以Qt的5.14.1版本来说明的,未来的版本也许和这有些不同。在Qt安装目录下的

Examples\Qt-XX.XX.XX\webchannel\chatserver

的工程,展示如何利用QWebSocketServer构建一个类似Web服务器,再利用QWebChannel向外部html和javascript网页客户端暴露一个QObject的对象,然后利用从派生的QWebChannelAbstractTransport子类在html和javascript网页与QWebChannel暴露的QObject的对象之间构建通信链路,以使这两者之间可以进行通信和数据交互。

本例子运行步骤如下:

  1. 启动chatserver程序,出现控制台界面。

如下:

  1. 看看目录Examples\Qt-XX.XX.XX\webchannel\chatclient-html目录下是否有qwebchannel.js文件。如果没有,则进行第3步;如果有,则进行第4步。

  1. 将Examples\Qt-XX.XX.XX\webchannel\shared\qwebchannel.js拷贝一份到 Examples\Qt-XX.XX.XX\webchannel\chatclient-html目录。

  1. 用浏览器打开Examples\Qt-XX.XX.XX\webchannel\chatclient-html\chatclient.html。在弹出的页面登录框随意输入一个字符串。如下:

登录之后,界面如下:

读者只要弄懂前文提到的几个核心类,理解chatserver工程是很简单的,故本博文不再详细解释chatserver工程,另外在Qt安装目录下的

Examples\Qt-XX.XX.XX\webchannel\standalone

工程,也是利用前文提到的几个核心类实现的,读者可以自行研究。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/373597.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解java虚拟机精华总结:如何判断对象是否可回收、引用、finalize、方法区回收、垃圾收集算法、垃圾收集器、内存分配与回收策略

深入理解java虚拟机精华总结:如何判断对象是否可回收、引用、finalize、方法区回收、垃圾收集算法、垃圾收集器、内存分配与回收策略如何判断对象是否可回收引用计数可达性分析法引用finalize方法区回收垃圾收集算法标记-清除算法标记-复制算法标记-整理算法垃圾收集…

141周期acwing(kmp)

一个字符串的前缀是从第一个字符开始的连续若干个字符,例如 abaab 共有 5 个前缀,分别是 a,ab,aba,abaa,abaab。 我们希望知道一个 N 位字符串 S 的前缀是否具有循环节。 换言之,对于每一个从…

_vue-1

谈谈你对MVVM的理解 为什么要有这些模式,目的:职责划分、分层(将Model层、View层进行分类)借鉴后端思想,对于前端而已,就是如何将数据同步到页面上 MVC模式 代表:Backbone underscore jquer…

Docker buildx 的跨平台编译

docker buildx 默认的 docker build 命令无法完成跨平台构建任务,我们需要为 docker 命令行安装 buildx 插件扩展其功能。buildx 能够使用由 Moby BuildKit 提供的构建镜像额外特性,它能够创建多个 builder 实例,在多个节点并行地执行构建任…

YOLOv5模型学习记录

新年伊始,YOLOv8横空出世,这个还未开源时便引发界内广泛热议的目标检测算法,一经问世便再次引发热潮,而作为与其师出同源的YOLOv5,自然要拿来与其比较一番。接下来我们便来学习一下吧。 模型结构 首先便是模型结构了…

Lambda原理及应用

Lambda原理及应用 Lambda介绍 Lambda 是 JDK8 以后版本推出的一个新特性,也是一个重要的版本更新,利用 Lambda 可以简化内部类,可以更方便的进行集合的运算,让你的代码看起来更加简洁,也能提升代码的运行效率。 Lambda语法 非…

优先级队列(堆)  堆排序

前面介绍过队列,队列是一种先进先出(FIFO)的数据结构,但有些情况下,操作的数据可能带有优先级,一般出队列时,可能需要优先级高的元素先出队列,该中场景下,使用队列显然不合适,比如&a…

【数据库】MySQL

时间戳 可以在创建表的时候,创建时间戳 mysql数据库怎么加入时间戳_帅气的黑桃J的博客-CSDN博客_mysql 插入时间戳 数据库表的命名规范 数据库表字段命名规范 - 腾讯云开发者社区-腾讯云 (tencent.com) MySql 的大小写问题 以下是MySQL详细的大小写区分规则&am…

《爆肝整理》保姆级系列教程python接口自动化(二十三)--unittest断言——上(详解)

简介 在测试用例中,执行完测试用例后,最后一步是判断测试结果是 pass 还是 fail,自动化测试脚本里面一般把这种生成测试结果的方法称为断言(assert)。用 unittest 组件测试用例的时候,断言的方法还是很多的…

Spring系列-9 Async注解使用与原理

背景: 本文作为Spring系列的第九篇,介绍Async注解的使用、注意事项和实现原理,原理部分会结合Spring框架代码进行。 本文可以和Spring系列-8 AOP原理进行比较阅读 1.使用方式 Async一般注解在方法上,用于实现方法的异步&#xf…

无源晶振匹配电容—计算方法

以前有写过一篇文章“晶振”简单介绍了晶振的一些简单参数,今天我们来说下无源晶振的匹配电容计算方法: 如上图,是常见的的无源晶振常见接法,而今天来说到就是这种常见电路的电容计算方法,有两种: A&#…

CUDA 内存系统

CUDA 内存系统 本文主要是针对<cuda c编程权威指南>的总结,由于原书出版的时候cuda刚刚出到cuda6,之后的cuda版本可能有更新,可能需要我翻一翻文档,待更新. 内存系统架构图 常见的内存作用域与生存期 新特性 早期的 Kepler 架构中一个颇为好用的特性就是 CUDA 程序员可…

没有公网ip怎么外网访问nas?快解析内网端口映射到公网

对于NAS用户而言&#xff0c;外网访问是永远绕不开的话题。拥有NAS后的第一个问题&#xff0c;就是搞定NAS的外网访问。不过众所周知&#xff0c;并不是所有的小伙伴都能得到公网IP&#xff0c;由于IPV4资源的枯竭&#xff0c;一般不会被分配到公网IP。公网IP在很大程度上除了让…

文件的打开关闭和顺序读写

目录 一、文件的打开与关闭 &#xff08;一&#xff09;文件指针 &#xff08;二&#xff09; 文件的打开和关闭 二、文件的顺序读写 &#xff08;一&#xff09;fputc 1. 介绍 2. 举例 &#xff08;二&#xff09;fgetc 1. 介绍 2. 举例1 3. 举例2 &#xff08;三&…

长尾关键词使用方法,通过什么方式挖掘长尾关键词?

当你在搜索引擎的搜索栏中输入有关如何使用长尾关键词的查询时&#xff0c;你可能希望有简单快捷的方式出现在搜索结果中&#xff0c;可以帮助你更好地应用seo。 不过&#xff0c;这里要记住一件事&#xff1a;SEO 策略只会为你的网站带来流量&#xff1b;在你的产品良好之前&a…

VS编译系统 实用调试技巧

目录什么是bug?调试是什么&#xff1f;有多重要&#xff1f;debug和release的介绍windows环境调试介绍、一些调试实例如何写出&#xff08;易于调试&#xff09;的代码编程常见的错误什么是bug?其实bug在英文翻译中有表示臭虫的含义&#xff0c;因为第一次被发现的导致计算机…

【Linux驱动开发100问】什么是模块?如何编写和使用模块?

&#x1f947;今日学习目标&#xff1a;什么是Linux内核&#xff1f; &#x1f935;‍♂️ 创作者&#xff1a;JamesBin ⏰预计时间&#xff1a;10分钟 &#x1f389;个人主页&#xff1a;嵌入式悦翔园个人主页 &#x1f341;专栏介绍&#xff1a;Linux驱动开发100问 什么是模块…

堆的基本存储

一、概念及其介绍堆(Heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵完全二叉树的数组对象。堆满足下列性质&#xff1a;堆中某个节点的值总是不大于或不小于其父节点的值。堆总是一棵完全二叉树。二、适用说明堆是利用完全二叉树的结构来维护一组数…

css 画图之质感盒子

前言 css 众所周知可以做很多的事情&#xff0c;比如&#xff1a;界面效果、特效、独特的样式等。今天给各位朋友带来的是以box-shadow来画一个很有质感效果的一个盒子。 之前在网上冲浪的时候&#xff0c;发现了这样的一个效果&#xff0c;所以来记录一下。 下面是实现后的…

Zookeeper源码环境搭建

前言 一、IEDA导入zk源码 git clone -b release-3.7.0 gitgithub.com:apache/zookeeper.git二、切换到稳定分支 通过命令行切换zk分支到3.8.1稳定版。 git checkout -b branch-3.8.1三、编译项目 执行maven命令编译项目 mvn clean install -Dmaven.test.skiptrue三、集群搭…