-
2021-04-20 12:27:23
CEF和Electron都是跨平台客户端方案,CEF和Electron孰优孰劣?来看一下二者的对比。
相同点:
CEF和Electron都是基于chromium浏览器框架发展而来,核心技术和底层实现基本一致,形成了不同的跨平台技术解决方案,是因为各自进行了不同程度上的开发和扩展。
CEF在2011年发布了CEF1的第一个正式版本,Electron在2016年发布了1.0版本,并在同年完成mac商店和windows商店的线上发布。
两者安装包都非常大,就算单独开发的页面很小,纯原生的CEF和Electron应用,安装包都在50MB以上,因为两者都包含了chromium,ffmpeg,GLES等等组件。
不同点
CEF
版本更新:平均1~2月更新一次
原生接口:C/C++
文档:官方文档资料较少,网络资源不多
产品:有道云笔记、微信、QQ、钉钉
支持平台:Linux、Mac、Windows(XP)
难易程度:有一定难度
屏幕分享:没有
声卡采集:没有
自动升级:没有Electron
版本更新:平均每周更新一次,版本更新比较频繁
原生接口:JS/Node.js
文档:官方文档资料健全,网络资源比较丰富
产品:VSCode、GitHub、Facebook
支持平台:Linux、Mac、Windows
难易程度:上手比较容易
屏幕分享:支持
声卡采集:支持(windows)
自动升级:支持总结
综上,个人比较喜欢Electron,作为前端,JS上手快,开发成本和开发周期相对来说更低更短,而且社区活跃。
如果项目需要提供C++ SDK的话,建议考虑CEF,原生接口是C++,开发起来工作量相对较小。当然,也看自己的技术储备情况,选择适合你的技术方案。更多相关内容 -
何为瘦客户端、胖客户端和富客户端?
2021-01-20 06:18:05作为应用程序平台的Internet的到来为企业应用程序提供了一个全新的领域:一个基于Internet/intranet的应用程序运用一个只包含一个浏览器的瘦客户端。这个浏览器负责解释、显示和处理应用程序的图形用户界面(GUI)和... -
游戏服务器和客户端的区别
2021-08-12 09:38:58游戏服务器和客户端的区别 内容精选换一换访问CloudTable的HBase连接不上,出现如下所示的错误信息:出现该问题的可能原因为:网络访问不通。由于CloudTable的链接地址是内网地址,不是公网地址,不能在公网环境直接...游戏服务器和客户端的区别 内容精选
换一换
访问CloudTable的HBase连接不上,出现如下所示的错误信息:出现该问题的可能原因为:网络访问不通。由于CloudTable的链接地址是内网地址,不是公网地址,不能在公网环境直接连接CloudTable。您可以在客户端主机上ping一下CloudTable的ZK链接地址,如果无法ping通,说明网络不通。由于CloudTable的
OBS服务端遵照HTTP规范,在接口调用完成均会返回标准的HTTP状态码,HTTP状态码分类以及OBS中常见的HTTP状态码如下:HTTP状态码分类:分类分类描述1XX信息,服务器收到请求,需要请求者继续执行操作,一般对客户调用函数不可见。2XX成功,操作被成功接收并处理。3XX重定向,需要进一步的操作以完成请求,一般对客户调用函数不可见
游戏服务器和客户端的区别 相关内容
文件系统创建完成后,用户需在客户端挂载文件共享,在本地共享目录和CSG的文件共享建立映射,通过操作本地的目录实现对CSG共享目录的操作,实现数据实时上云管理。本章节主要介绍在Windows Server 2008客户端挂载NFS文件共享的操作指导。不同操作系统安装NFS客户端的命令不同,已明确服务器操作系统类型为Windows。已在CSG
负载均衡器会将客户端的请求转发给后端服务器处理。例如,您可以添加ECS实例作为负载均衡器的后端服务器,监听器使用您配置的协议和端口检查来自客户端的连接请求,并根据您定义的分配策略将请求转发到后端服务器组里的后端云服务器。新添加后端服务器后,若健康检查开启,负载均衡器会向后端服务器发送请求以检测其运行状态,响应正常则直接上线,响应异常则开始
游戏服务器和客户端的区别 更多内容
华为云帮助中心,为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档,帮助您快速上手使用华为云服务。
当出现以下问题时,可以参考本章节排查解决。可以直接访问后端业务,但是无法通过负载均衡访问后端业务。通过私网IP可以访问负载均衡,但是公网IP无法访问负载均衡。后端服务器健康检查异常。客户端通过负载均衡访问服务器示意图如图1。公网客户端的流量经过EIP传送到负载均衡器;私网客户端的流量直接通过私网IP传送到负载均衡器。负载均衡器根据监听器配
华为云帮助中心,为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档,帮助您快速上手使用华为云服务。
客户端版本有X86和ARM平台区分,不同平台下支持的操作系统也是不相同的。请根据客户端所在的服务器或ECS的平台和操作系统选择对应的版本下载。
一般的HTTPS业务场景只对服务器做认证,因此只需要配置服务器的证书即可。某些关键业务(如银行支付),需要对通信双方的身份都要做认证,即双向认证,以确保业务的安全性。此时,除了配置服务器的证书之外,还需要配置客户端的证书,以实现通信双方的双向认证功能。本章节以自签名证书为例,介绍如何配置HTTPS双向认证。但是自签名证书存在安全隐患,建议
企业主机安全(Host Security Service,HSS)是提升服务器整体安全性的服务,为用户提供资产管理、漏洞管理、入侵检测、基线检查等功能,降低服务器被入侵的风险。在弹性云服务器中安装Agent后,云服务器受到HSS云端防护中心全方位的安全保障,在安全控制台可视化界面上,您可以统一查看并管理同一区域内所有主机的防护状态和主机安
GaussDB(DWS) 支持SSL标准协议(TLS 1.2),SSL协议是安全性更高的协议标准,它们加入了数字签名和数字证书来实现客户端和服务器的双向身份验证,保证了通信双方更加安全的数据传输。为支持SSL连接方式,GaussDB(DWS) 已经从CA认证中心申请到正式的服务器、客户端的证书和密钥(假设服务器的私钥为server.key
将网站域名接入华为云Web应用防火墙(Web Application Firewall,WAF),能够帮助您的网站防御常见的Web攻击和恶意CC攻击流量,避免网站遭到入侵导致数据泄露,全面保障您网站的安全性和可用性。
介绍使用同一VPC内弹性云服务器ECS上的C# Redis客户端连接Redis实例的方法。更多的客户端的使用方法请参考Redis客户端。已成功申请Redis实例,且状态为“运行中”。已创建弹性云服务器,创建弹性云服务器的方法,请参见《弹性云服务器用户指南》。如果弹性云服务器为Linux系统,该弹性云服务器必须已经安装gcc编译环境。具体步
当创建文件系统后,您需要使用云服务器来挂载该文件系统,以实现多个云服务器共享使用文件系统的目的。本章节以Windows 2012版本操作系统为例进行NFS文件系统挂载,其他版本请参考以下主要步骤根据实际界面进行配置。同一SFS容量型文件系统不能同时支持NFS协议和CIFS协议。裸金属服务器、容器(CCE&CCI)操作与云服务器一致。已完成
-
瘦客户端和智能客户端
2020-03-04 11:34:36当然,有许多因素会影响有关哪种方法最适用于特定应用程序的决策,如客户端平台要求、应用程序部署和更新、用户体验、性能、客户端集成、脱机功能等,而各种方法都有与生俱来的优点和缺点,自然而然地支持某种特定... -
TheMovieDatabaseApiClient:苹果平台的API客户端:iOS tvOS macOS
2021-02-14 12:39:24Apple平台的API客户端:iOS / tvOS / macOS。 配置 themoviedb.org API已本地化。 本地化基于您与请求一起发送的language查询参数。 该API将标准用于语言代码。 默认语言配置 通过仅设置apiKey参数,客户端将获取... -
C#Socket编程服务器和多客户端通信,客户端和客户端通信
2020-07-20 21:58:14对于Socket编程,网上资料、博文一抓一大把,不过大多数都是简单讲解单客户端和服务端通信的实例,这里主要给大家展现一下在.net平台上用窗体程序实现的过程,不过比较有特点的是会告诉大家如何实现不同客户端之间的...对于Socket编程,网上资料、博文一抓一大把,不过大多数都是简单讲解单客户端和服务端通信的实例,这里主要给大家展现一下在.net平台上用窗体程序实现的过程,不过比较有特点的是会告诉大家如何实现不同客户端之间的通信,它们如何通过一个服务端准确的找到对方进行通信,包括上线提醒、私信交流、昵称重名处理等功能。
一、服务端架构
1、开启监听
简单来说,服务端首先要创建一个监听线程,检测客户端的连接情况,这个部分的程序封装在一个按钮里。主要实现代码如下:
Thread threadwatch = null;//负责监听客户端的线程 //创建一个监听线程 threadwatch = new Thread(watchconnecting); //将窗体线程设置为与后台同步,随着主线程结束而结束 threadwatch.IsBackground = true; //启动线程 threadwatch.Start();
如果有仔细看我上面给出的代码细心的观众会发现有个watchconnecting()方法被委托进了监听线程,其实这就是一个监听客户端信息消息的函数,很老套的过程:
Socket connection = null; while (true) //持续不断监听客户端发来的请求 { try { connection = socketwatch.Accept(); }
其中
Socket socketwatch = null;//负责监听客户端的套接字
也只是大家异常熟悉的Socket套接字,这部分绑定IP和端口到Point,然后
//监听绑定的网络节点 socketwatch.Bind(point); //将套接字的监听队列长度限制为20 socketwatch.Listen(20);
的过程应该在前面服务端开启监听线程的按钮里实现,这里就不细说了。
然后创建一个通信线程,对服务端和客户端之间的交流进行一个完善:
//创建一个通信线程 ParameterizedThreadStart pts = new ParameterizedThreadStart(recv); Thread thread = new Thread(pts); thread.IsBackground = true;//设置为后台线程,随着主线程退出而退出 //启动线程 thread.Start(connection);
2、服务端通信过程
由之前代码里创建的通信线程里委托的recv()方法,看字面意思也知道是接收客户端发送消息的接收函数。也是很常规的部分:
Socket socketServer = socketclientpara as Socket; while (true) { //创建一个内存缓冲区 其大小为1024*1024字节 即1M byte[] arrServerRecMsg = new byte[1024 * 1024]; //将接收到的信息存入到内存缓冲区,并返回其字节数组的长度 try { int length = socketServer.Receive(arrServerRecMsg); //将机器接受到的字节数组转换为人可以读懂的字符串 string strSRecMsg = Encoding.UTF8.GetString(arrServerRecMsg, 0, length); //将字符串转化为二进制流进行其他操作 byte[] bytes = System.Text.Encoding.UTF8.GetBytes(strSRecMsg);
注意,将接收到的信息转化为二进制流之后可以Send(bytes)转发消息了,当然,这一块之后会细讲,这里只是先大概介绍下流程。
二、客户端架构
由于客户端基本架构和服务端大体相似,只是在监听部分转为尝试连接部分,大家记住这两个变量:
//创建 1个客户端套接字 和1个负责监听服务端请求的线程 Thread threadclient = null; Socket socketclient = null;
和服务端大同小异,不过注意要在客户端绑定的是之前在服务端绑定的相同IP和端口才能互通,同样将IP和端口绑定到Point上:
try { //客户端套接字连接到网络节点上,用的是Connect socketclient.Connect(point); }
即服务端是Accept,客户端是Conncet,然后同样开启一个监听服务端的线程:
threadclient = new Thread(recv); threadclient.IsBackground = true; threadclient.Start(socketclient);
至于里面的recv,和前面的服务端完全一样,就不重述了。
三、获取本地IP4的方法
大家是否为如何精确获得IP4的IP地址烦恼呢,又不想手动去查,好吧,这里有一个方法送给大家:
public static string GetLocalIP() { try { string HostName = Dns.GetHostName(); //得到主机名 IPHostEntry IpEntry = Dns.GetHostEntry(HostName); for (int i = 0; i < IpEntry.AddressList.Length; i++) { //从IP地址列表中筛选出IPv4类型的IP地址 //AddressFamily.InterNetwork表示此IP为IPv4, //AddressFamily.InterNetworkV6表示此地址为IPv6类型 if (IpEntry.AddressList[i].AddressFamily == AddressFamily.InterNetwork) { return IpEntry.AddressList[i].ToString(); } } return ""; } catch (Exception ex) { MessageBox.Show("获取本机IP出错:" + ex.Message); return ""; } }
四、服务端转发消息
1、转发处理
这个部分即为本文的核心所在,之前铺垫的也都是大家或多或少都了解的,而这个部分我在网上浏览资料时并没有发现比较鲜明的介绍。
首先注意这两个字典集:Dictionary<string, Socket> dic = new Dictionary<string, Socket> { }; //定义一个集合,存储客户端信息 Dictionary<string, string> dicName = new Dictionary<string, string> { }; //昵称与客户端对应
我们的服务端在客户端连接上服务端时是有办法知道客户端的信息的:
//获取客户端的IP和端口号 IPAddress clientIP = (connection.RemoteEndPoint as IPEndPoint).Address; //获取客户端的IP和端口号 int clientPort = (connection.RemoteEndPoint as IPEndPoint).Port; RemoteEndPoint = connection.RemoteEndPoint.ToString(); //客户端网络结点号
至于为什么我会建立两个字典集,dic里保存的是
RemoteEndPoint = connection.RemoteEndPoint.ToString(); //客户端网络结点号 connection = socketwatch.Accept();
RemoteEndPoint是套接字Socket里的一个属性,能唯一的辨识出不同客户端连接时套接字的网络节点,当然,如果有其他类似的属性也可以代替。则RemoteEndPoint 就是Connection的唯一身份标识,那么我们在进行Socket里面一些属性操作时,比如用connection 发送、接收消息都可以以RemoteEndPoint 这个标识来鉴别身份。
不过每个客户端都能自己给自己起个好听的昵称,不然全是网络节点号也记不住,分不清哪个是自己,所以我又用了dicName把网络节点号和客户端的昵称绑在了一起,相当于实现了一个双层的嵌套;要查找对应信息建议使用LINQ,十分简单,比如:
var name = dicName.Where(q => q.Value == socketServer.RemoteEndPoint.ToString()).Select(q => q.Key); string leavemsg = name.FirstOrDefault()
就可以轻松找出已知某个网络节点号的昵称。
所以服务端转发消息就是当接收到一个客户端传来的消息时会自动将接受到的任何消息转发到其他所有客户端,这个在字典集里遍历就可以实现,比如:
//转发消息给其他客户端 byte[] bytes = System.Text.Encoding.UTF8.GetBytes(strSRecMsg); foreach (string Client in dicName.Values) { if (Client != socketServer.RemoteEndPoint.ToString())//只要不是自己 dic[Client].Send(bytes); //发送数据 }
要注意的是,将客户端消息存进字典里的代码是要写在服务端开启监听登录的按钮里,这样每次客户端一连接成功就会记录一次。
2、区别客户端
也许有人会问,虽然转发实现了,但是那么多客户端之间发送的消息如何辨别呢,这里有两种处理方法:可以在服务端设置一个变量保存每一个连接时客户端的昵称,在转发消息时将这个变量放在消息头,这样就可以区分;不过我认为这个方法还是比较麻烦的,既然消息来源是客户端,那我们就在客户端发送的消息头加上每个客户端自己的昵称,这样所有客户端发送的消息都是带有自己的昵称的,这样就不需要我们再过多的处理了。
五、上线下线提醒
1、上线
其实方法很简单,只要知道了转发的实现很容易想到,只要在客户端开启监听服务的按钮里写一段发送昵称消息给服务端的代码:
byte[] name = Encoding.UTF8.GetBytes(textBoxName.Text); //调用客户端套接字发送字节数组 socketclient.Send(name);
服务端监听客户端端登录时,会收到来自客户端发出的昵称消息,服务端将昵称存进字典集里就将昵称转发到其他客户端提醒“XXX,上线了”:
//上线提醒 string msg = strRecMsg +","+"上线了"; byte[] Msg = Encoding.UTF8.GetBytes(msg); foreach (string Client in dicName.Values) { if (Client != RemoteEndPoint) dic[Client].Send(Msg); //发送数据 }
2、下线
下线,我的处理是全部放在套接字监听连接中断异常里,即,只要Socket中断或者连接失败,就会在异常里转发下线消息:
catch (Exception ex) { //下线处理
道理和上线差不多,只是代码的位置不同。
六、昵称重名处理
由前面的介绍,我们知道客户端在连接服务端时会发送一个昵称消息给服务端,服务端将昵称存起来后如果发现字典集里有相同的名字则会关闭正在通信Sock,发送一个提示消息给客户端:
//获取昵称 byte[] RecMsg = new byte[1024 * 1024]; int length = connection.Receive(RecMsg); string strRecMsg = Encoding.UTF8.GetString(RecMsg, 0, length); //检查昵称重名 if (dicName.Count>0) { string ack = "昵称已存在,请重新输入昵称"; byte[] ackMsg = Encoding.UTF8.GetBytes(ack); if (dicName.ContainsKey(strRecMsg)) { Flag = true; connection.Send(ackMsg); //离线处理 connection.Close();
相应的,客户端在受到服务端传过来的提示消息时,关闭Sock下线:
string strRevMsg = Encoding.UTF8.GetString(arrRecvmsg, 0, length); string []s=strRevMsg.Split(','); if (s[0] != textBoxName.Text) { if (strRevMsg == "昵称已存在") { socketServer.Close(); this.buttonStart.Enabled = true; break;
这里有两个要特别注意的地方,首先是if (s[0] != textBoxName.Text)是针对之前的上线提醒,在昵称重名时不提醒上线消息,我们接着看一段客户端开启监听的代码:
try { //SocketException exception; this.buttonStart.Enabled = false; //定义一个套接字监听 socketclient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //获取文本框中的IP地址 IPAddress address = IPAddress.Parse(textBoxIP.Text.Trim()); //将获取的IP地址和端口号绑定在网络节点上 IPEndPoint point = new IPEndPoint(address, int.Parse(textBoxPort.Text.Trim()));
很显然,我们在点击开启监听的按钮后,按钮会置灰,这也是一种将Socket连接状态反应在按钮上的一个同步,所以当Socket断开时,我们需要this.buttonStart.Enabled = true;这样才能重新点击按钮,输入正确要求的昵称再重新连接服务端。
七、私聊
之前服务端转发实现的只是群聊,那么私聊怎么办呢。其实也很简单,我这里以服务端和其他不同客户端私聊为例。
因为能分辨不同的客户端,那么想和谁私聊不是轻松的很。我的做法是将dicName的消息展示到一个ListBox里:void OnlineList_Disp(string Info) { if(!listBoxOnlineList.Items.Contains(Info)) listBoxOnlineList.Items.Add(Info); //在线列表中显示连接的客户端 }
在服务端想私聊时,只要点击列表里一个客户端,将代码写在一个按钮里,详细实现如下:
string sendMsg = "管理员:"+richTextBoxSend.Text.Trim(); //要发送的信息 byte[] bytes = System.Text.Encoding.UTF8.GetBytes(sendMsg); //将要发送的信息转化为字节数组,因为Socket发送数据时是以字节的形式发送的 if (listBoxOnlineList.SelectedIndex == -1) { MessageBox.Show("请选择要发送的客户端!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Stop); } else { string selectClient = listBoxOnlineList.Text; //选择要发送的客户端 var point = dicName.Where(q => q.Key == selectClient).Select(q => q.Value); dic[point.FirstOrDefault()].Send(bytes); //发送数据 richTextBoxSend.Clear(); }
如果客户端之间想自己私聊呢,其实完全可以衍变过去不是吗,那我就把客户端接收上线提醒的昵称存到一个字典里进行类似操作不是也可以?所以方法都是通的,甚至可以像QQ、微信那样设计,在点击一个字典里的信息时跳转个页面到大对话框不也是美滋滋。
八、其他
如果有时间,我会尝试突破局域网的限制,实现外网之间Socket通信,目前思路有两个:花生壳内网映射,去阿里云租个外网服务器,当然这些都是后话了,有机会再一起探讨~
————————————————
版权声明:本文为CSDN博主「Yujie_Yang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Yujie_Yang/article/details/53647258https://www.csdn.net/gather_21/MtTaEgysNjctYmxvZwO0O0OO0O0O.html
-
对于Qt跨平台客户端开发的一些看法
2021-07-23 19:15:47Qt能跨平台开发,这是大家都知道的,但是,真的做起来不是那么容易,很多公司的客户端也没也完全用跨平台框架来开发,而是在windows, macOS,linux上各搞一套,比如windows用DuiLlib、Qt、或者自己写的UI框架;...一、Qt跨平台开发的一点疑虑
Qt能跨平台开发,这是大家都知道的,但是,真的做起来不是那么容易,很多公司的客户端也没也完全用跨平台框架来开发,而是在windows, macOS,linux上各搞一套,比如windows用DuiLlib、Qt、或者自己写的UI框架;macOS则用swift / oc,如果用Qt进行windows和macOS跨平台开发,是要慎重考虑的,最好windows一套代码,macOS尽量用swift/oc来做,很多东西在windows上解决方案很多,用C/C++基本都可以搞定,但是在macOS就不一定了,虽然C/C++/OC/swift可以相互调用,但是这增加了代码复杂度,也对开发人员的技术有很大的考验。
二、开发建议
下面分享一下Qt客户端开发的一些个人建议
2.1 IDE选择
用Qt做界面库,IDE可以用QtCreator和VS,如果不考虑跨平台,那么在windows上就用VS, 调试、项目管理也很方便,QtCreator能做的,vs也能做,而且VS和QtCreator项目可以相互转换;linux那就用QtCreator吧。另外现在比较新的vscode和clion也是可以尝试,不过主流依然是QtCreator和VS,vscode免费,但是项目配置麻烦,调试也不太方便;CLion是收费的,很少有公司用,用盗版很容易被律师函警告的,JetBrains在IDE领域基本已经通吃了,每年花费2000元就可以享有所有编程语言的ide使用权。
2.2 通用库的选择
项目开发,必然要使用到各种库,比如日志库、网络库、线程库等。
(1) log
如果用C++开发,log那么可以考虑glog、log4cplus、log4cpp,如果觉得个人功力深厚,也可以自己封装一个log;Qt也有第三饭log库,比如QsLog。
(2) 网络库
用Qt的话,Qt本身支持网络开发,http、tcp、udp、ftp等都可以,如果不想用Qt网络库,那么可以用系统库,windows, linux都有自己的socket, 不过有一点不好的是,系统库可能不跨平台。如果需要和后台java/php等进行接口的调用,可以考虑QtNetwork框架,或者用libcurl,二者都可以进行get、post.
(3)线程库
Qt对thread有支持,可以使用QThread进行开发,当然C++ 11之后,从语言层面解决了多线程得跨平台问题,可以用std::thread代替其它得线程库。
(4)图表曲线模块
一些嵌入式,监控行业,可能会用到图标,QCharts支持各类图表,之前的QCustomPlot,QWT等也是很好的图标曲线组件,但是我要提一嘴ECharts, 这是百度开源的图表组件,这是我目前见过的最好的图表库,利用Qt web交互技术是可以使用ECharts的,然后动态绑定数据即可。
(5)编码规范
每个公司都有自己编程规范,入职时得先了解,不然写起代码来,随便搞,那就很不协调了,有强迫症的看到,估计很不爽,必须改过来,你一改动,就会触发git冲突,对别人也是一种侵犯,这就是业内的一种现象"不要瞎该我的代码",业内比较正规的有google C++规范,华为C++编码规范等,或者更具项目需求,自定义一套规范,对于入职的新人让他们先学一学。
(6)开发流程 git follow
git follow没得说,就当作标准来执行吧。
2.3 复杂页面设计
像一些简单的页面,用QWidget或者Qt Designer是可以慢慢搞出来,就拿优酷界面来说
优酷客户端用到了Qt/QML,标题栏和左侧栏相信有一定基础的人能做出来,首先需要把窗口边框去掉,然后自己写一个标题栏,左侧布局用QListWidget轻松实现,可以看看我的实现【教你用Qt手写优酷客户端界面】,但是中间区域呢,用QScrollArea是可以做,但是太复杂了,而且需要实时的更新,那么必然得和后端交互,那么用前端web技术应该就比较好实现,让前端去做那些视频的布局,播放解码用web技术也是可以实现的,用Qt ffmpeg之类的也可以,问题不大,下面是优酷的网页版:
是不是和客户端界面很类似,这些视频窗口估计有上千个控件了,用web技术是最好的解决方案,用Qt得写到什么时候,而且用web得话,跨平台方便,在windows, macOS, 移动端直接调html,基本可以保持效果一致,而且对于播放来说,应该是类似m3u8这种文件,一个url就可以播放,解决了跨平台得麻烦。
wps的稻壳商城,应该也是用web技术做的。
Qt和web的交互现在已经做的很好了,QWenEnginView对chrome的支持很友好,可以达到cef的效果。
2.4 自适应分辨率
在我的Qt进阶文章中有谈到关于分辨自适应问题,现在笔记本电脑都是2.2k, 2.5k, 3k乃至4k分辨率,你在公司1920*1080的显示器上开发的界面效果在别人电脑可能就不一样了,此时就需要自动的改变Qt控件的大小,图标也尽量使用svg图,而不是png,Qt本身对窗口自适应的属性也有支持,大家可以去测试看看。
2.5 跨域语言、中文乱码问题
关于这个,得用翻译文件来做,问题不大。
2.6 exe打包技术
安装包制作,方案很多,可以使用NSIS或者Qt原生的IFW技术。
2.6 模块划分
小项目随便写写,一个人撸完也不是不可以,大项目呢,尽量把功能分开,能封装成dll就做程dll, 提供接口,外部调用,这样在协同开发时也方便,对于软件更新也有帮助。
2.7 软件更新
当用户安装软件后,后续更新怎么做呢,就是怎样把服务端新的安装程序下载到用户电脑上,现在客户端技术已经是达到顶峰了,这块儿一般也是需要前端来做的,比如增量更新,在启动客户端时,检查本地版本和服务端的版本,相同的文件进行下载,不同的不下载,这一块儿我也没有深入研究,相信有更好的技术来显示。
2.8 数据埋点
埋点这种行为,有点窃取用户隐私的做法,但实质也没什么伤害,只是让运营商更了解用户对软件的使用情况。这个一般是产品经理超滤的事情,他们说怎么做,开发就去实现。现在埋点都有服务商提供,花钱买就可以了。
三、Qt就业环境
关于就业趋势我在之前的文章也讲了一些,虽然岗位不多,但是依然可以要口饭吃,一些大厂也有相应的岗位,例如很火的抖音,字节跳动提供了视频剪辑工具“剪映”,它就是用Qt/QML开发的,以及WPS客户端、斗鱼客户端、优酷客户端、UOS等都是用Qt开发的,Qt/MFC等windows界面开发依然是有不少岗位,但没有java python 大数据 人工智能那么多,毕竟是流量为王的时代,移动端,大数据,深度学习,数据挖掘等是大趋势,客户端开发在这大环境下能分一杯羹也是不容易的。另外比较重要的一点是C++前端和web前端有很大的区别,web前端更多的是业务展示,不涉及领域的知识,但是C++前端的工作,大部分情况下是要兼顾相关领域知识,比如做音视频,视频的显示,音视频同步等,做图片算法的,图片的展示,内存的处理等,做其它行业也是一样的,不能只关注界面的效果,相关领域的知识也要深究。
-
服务器端渲染和客户端渲染有什么区别?
2017-05-08 10:52:46首先我们将通过下面这份简单的时间线图展示SSR与CSR(即客户端渲染)之间的区别。 可以看到其中最大的区别在于,在使用SSR的情况下您的服务器对浏览器的响应结果属于已做好准备并可进行渲染的页面HTML,... -
使用通信层在客户端和服务器之间进行通信 - java
2021-03-19 10:19:45我正在遵循一个规范,该规范说我必须编写Comms类来进行客户端和服务器之间的通信:编写一个Comms类,该类将处理服务器应用程序和客户端应用程序之间的通信。提供一种“ sendMessage”方法,该方法允许每个客户端将... -
客户端开发和服务器端开发哪个有前途?自学跟培训的区别?
2021-02-03 16:22:20对于这一类应用程序,需要网络中有相应的服务器和服务程序来提供相应的服务,如数据库服务,电子邮件服务等等,这样在客户机和服务器端,需要建立特定的通信连接,来保证应用程序的正常运行 服务器端应用非常广泛,... -
海康威视IVMS-8700PC客户端操作指南
2019-03-24 01:58:06海康威视IVMS-8700平台 PC端客户端操作指南,客户端软件说明书 -
jellyfin-mpv-shim:Jellyfin 的 MPV Cast 客户端
2021-07-24 01:34:13它支持您无需转码的所有高级媒体文件,以及使其与其他多媒体客户端区别开来的大量功能: 使用 MPV 直接播放大多数媒体。 使用 SyncPlay 与朋友一起观看视频。 提供在后台运行的填充模式。 Jellyfin 移动应用... -
客户端和服务器通信协议
2021-08-11 03:59:12客户端和服务器通信协议 内容精选换一换设备接入到物联网平台后,便可与物联网平台进行通信。设备通过自定义Topic或产品模型方式将数据上报到平台,在控制台设置后,通过订阅推送的方式,将设备生命周期变更、设备... -
富客户端与瘦客户端
2018-07-15 08:57:54瘦客户端与富客户端是两个相对的概念。有两种分类方式:1.b/s结构的网络应用程序与c/s结构的应用程序,可以...典型的胖客户端应用程序都包含一个或多个在服务器和客户pc上运行的应用程序,客户pc上安装功能丰富的... -
移动客户端及pc浏览器UA区分
2013-09-23 10:26:12囊括目前全部移动平台客户端及PC浏览器的UA区分。 -
SSH/SSH客户端介绍、利用SSH访问linux、SSH跟telnet区别
2022-01-04 23:13:211、SSH的定义: SSH 为Secure Shell的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。...SSH客户端适用于多种平台。几乎所有UNIX平台—包括HP-UX、Linux、... -
网络监控系统,产品自带的免费客户端和管理平台的区别?
2012-03-27 21:57:45网络视频监控系统必须要配合网络监控软件使用,网络监控软件主要有两种:一种是编码设备自带的免费客户端软件,另一种是收费的网络视频综合管理平台软件。下面简单介绍一下两种软件的区别: 1、兼容性: 一般... -
客户端怎么和服务器通信协议
2021-08-12 01:21:02客户端怎么和服务器通信协议 内容精选换一换TCP :传输控制协议(TCP),是互联网协议组的主要协议之一。它起源于最初的网络实施,在网络实施中,它补充了互联网协议。UDP: 用户数据报协议(User Datagram Protocol)是... -
web客户端和服务器分别指什么
2021-08-08 02:12:07web客户端和服务器分别指什么 内容精选换一换华为云帮助中心,为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档,帮助您快速上手使用华为云服务。云证书管理... -
OPC配置客户端和服务端
2019-10-23 09:35:19客户端与服务端都装好相应的OPC软件后,需要做一些配置才能达到远程访问的目的。 分别在客户端和服务端上添加相同的账户名和密码,一定要确保相同。因为访问是通过windows验证的,在远程访问时需要有着相同的账户和... -
桌面、客户端-服务器和 Web 应用测试的区别,如何选择软件测评机构
2022-02-17 11:53:44在这个软件产品层出不穷的时代,不管是移动软件还是pc软件都是需要进行相关的测试才能到用户的手中,这样是对自身的软件负责也是对用户负责,当然在这当中每个测试的环境都不同,所以针对不用的软件产品需要区别对待... -
通过c/c++在linux平台实现服务器/客户端直接的通信
2021-09-05 08:32:00测试平台 Ubuntu 4.2.0-27-generic 实现回声服务器的客户端/服务器程序,客户端通过网络连接到服务器,并发送任意一串英文信息,服务器端接收信息后,将每个字符转换为大写并回送给客户端显示。 服务器端运行server... -
[转]关于胖客户端和瘦客户端的理解
2021-02-05 09:30:53C/S B/S的区别你是不是说胖客户端相当于一个C/S结构,而瘦客户端相当于一个B/S结构呀胖客户端和瘦客户端是相对的.之间的区别在于是否有大量的业务逻辑需要放在客户端,c/s结构中,主要的逻辑程序放在客户端,很多时候... -
金蝶eas客户端
2021-05-16 12:49:37??金蝶eas客户端是功能很全面的一款操作软件。金蝶eas客户端使用起来也很简单,对财务的记录也很多...财务工作从核算到预算都更加的精细化管理,管理重点将从过去的事后报表数据分析转变为业务决策 支持和风险监... -
Spring Security Oauth2:授权模式、简单模式 、密码模式 和 客户端模式
2021-02-19 21:16:10步骤2:用户单击客户端所呈现的服务授权页面上的同意授权按钮后,服务端返回一个授权许可凭证给客户端。 步骤3:客户端拿着授权许可凭证去授权服务器申请令牌。 步骤4:授权服务器验证信息无误后,发放令牌给... -
【微服务】什么是微服务?微服务与分布式的区别?微服务怎么具体实践微服务?服务端发现和客户端发现
2020-03-20 10:53:16客户端如何访问这些服务? 服务之间如何通信? 这么多服务,怎么找? 服务挂了怎么办? 客户端如何访问这些服务? 客户端UI如何访问他的?后台有N个服务,前台就需要记住管理N个服务,一个服务下线/更新/升级,... -
Zabbix服务器和客户端的安装与配置
2018-06-29 10:41:37等功能,它可以运行在Linux,Solaris,HP-UX,AIX,Free BSD,Open BSD, OS X等平台上。 详细介绍可以通过官方文档查阅:HTTPS://www.zabbix.com/documentation/3.4/zh/manual/introduction/features。 ... -
java在服务器端和客户端传输图片和文件.pdf
2021-03-15 12:06:30java在服务器端和客户端传输图片和文件Java基于Socket文件传输示例1.服务器端package sterning;import java.io.BufferedInputStream;import java.io.DataInputStream;import java.io.DataOutputStream;import java.... -
WebService客户端和服务端的实现
2018-12-17 16:49:06一、WebService到底是什么 一言以蔽之:WebService是一种跨编程语言... 所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然!跨操作系统平台则是指服... -
企信通短信平台 客户端WEB网页版源代码 全协议网关
2011-11-18 16:06:05北信正通电信级短信平台MC-SMS,是一套全协议多链路跨平台可集群分布式的基于最底层通讯协议构架起来的一套电信级短信平台,与现有市场上的短信平台有着质的区别,应用于增值业务提供商(SP)、各级电信通道运营商及...