libvncclient编写多线程qt的VNC客户端

2024-09-04 16:36

本文主要是介绍libvncclient编写多线程qt的VNC客户端,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述

  • 使用qt和libvncclient编写vnc的客户端程序,多线程读写,拒绝卡顿。
  • qt环境:5.15.3
  • libvncclient:0.9.14
  • 下载地址:https://github.com/LibVNC/libvncserver/releases

编译libvncclient

  • 打开CMakeList文件,找到编译开关,注释掉不需要的编译项目:
# all the build configuration switches
option(LIBVNCSERVER_INSTALL "Generate installation target" ON)
option(BUILD_SHARED_LIBS "Build shared libraries" ${UNIX})
option(WITH_ZLIB "Search for the zlib compression library to support additional encodings" ON)
option(WITH_LZO "Search for the LZO compression library to omit internal miniLZO implementation" ON)
option(WITH_JPEG "Search for the libjpeg compression library to support additional encodings" ON)
option(WITH_PNG "Search for the PNG compression library to support additional encodings" ON)
option(WITH_SDL "Search for the Simple Direct Media Layer library to build an example SDL vnc client" ON)
option(WITH_GTK "Search for the GTK library to build an example GTK vnc client" ON)
option(WITH_LIBSSHTUNNEL "Search for libsshtunnel to build an example ssh-tunneled client" ON)
option(WITH_THREADS "Search for a threading library to build with multithreading support" ON)
option(PREFER_WIN32THREADS "When searching for a threading library, prefer win32 threads if they are found" ON)
option(WITH_GNUTLS "Search for the GnuTLS secure communications library to support TLS" OFF)
option(WITH_OPENSSL "Search for the OpenSSL cryptography library to support TLS and use as crypto backend" ON)
option(WITH_SYSTEMD "Search for libsystemd to build with systemd socket activation support" ON)
option(WITH_GCRYPT "Search for Libgcrypt to use as crypto backend" ON)
option(WITH_FFMPEG "Search for FFMPEG to build an example VNC to MPEG encoder" ON)
option(WITH_TIGHTVNC_FILETRANSFER "Enable filetransfer if there is pthreads support" ON)
option(WITH_24BPP "Allow 24 bpp" ON)
option(WITH_IPv6 "Enable IPv6 Support" ON)
option(WITH_WEBSOCKETS "Build with websockets support" ON)
option(WITH_SASL "Build with SASL support" ON)
option(WITH_XCB "Build with XCB support" ON)
option(WITH_EXAMPLES "Build examples" OFF)
option(WITH_TESTS "Build tests" OFF)
option(WITH_QT "Build the Qt client example" OFF)
  • 也可以自己手动去掉不需要的库依赖,我这里没有把server的库依赖去干净。
  • 然后取出项目中的libvncclient.so和头文件中的client目录到自己的项目中。
  • 将build目录中的include中的rfbconfig.h拷贝到头文件目录

项目思路

  • 主要思路如下:
  • 创建一个主窗口QWidget用于画面渲染,创建一个接收线程和一个发送线程。
  • 接收线程负责读取vnc服务器发送的数据并解码装换成QImage,通过信号发送QImage,通知主线程刷新页面。
  • 发送线程用于发送主窗口的鼠标移动,点击等事件,用于实时更新操作。

项目编写

  • VncWideget : 主要的渲染窗口
#ifndef VNCVIEWWIDGET_H
#define VNCVIEWWIDGET_H#include <QWidget>
#include <QThread>#include "rfb/rfbclient.h"
#include "rfb/rfbconfig.h"#include "vnc_client/vncrecvthread.h"
#include "vnc_client/vncsendworker.h"class VncViewWidget : public QWidget
{Q_OBJECT
public:explicit VncViewWidget(QString ip, quint32 port, QWidget *parent = nullptr);~VncViewWidget();void start();void stop();inline bool isStarted(){return _startFlag;}void updateImage(const QImage& image);void paintEvent(QPaintEvent *event) override;void mouseMoveEvent(QMouseEvent* event) override;void mousePressEvent(QMouseEvent *event) override;void mouseReleaseEvent(QMouseEvent *event) override;void closeEvent(QCloseEvent* event) override;private:QImage _image;rfbClient *_cl;QString _ip;quint32 _port;bool _startFlag = false;QThread* _vncSendThread;VNCSendWorker* _vncSendWorker;VNCRecvThread* _vncRecvThread;signals:void sendMouseState(rfbClient* cl, int x, int y, int button);void fullWindowCloseSignal();public slots:
};#endif // VNCVIEWWIDGET_H
  • VNCSendWorker:数据发送工作线程
#ifndef VNCSENDWORKER_H
#define VNCSENDWORKER_H#include <QObject>#include "rfb/rfbclient.h"class VNCSendWorker : public QObject
{Q_OBJECT
public:explicit VNCSendWorker( QObject *parent = nullptr);signals:public slots:void sendMouseUpdateMsg(rfbClient* cl, int x, int y, int button);};#endif // VNCSENDWORKER_H

VNCRecvThread :接收线程

#ifndef VNCRECVTHREAD_H
#define VNCRECVTHREAD_H#include <QThread>#include <QImage>#include "rfb/rfbclient.h"class VNCRecvThread : public QThread
{Q_OBJECT
public:VNCRecvThread(QObject* parent = nullptr);inline void startRun(rfbClient* cl){if(_runFlag)return;_cl = cl;_cl->FinishedFrameBufferUpdate = frameBufferUpdated;rfbClientSetClientData(_cl, nullptr, this);_runFlag = true;this->start();}inline void stopRun(){if(!_runFlag)return;_runFlag = false;if(_cl)rfbClientSetClientData(_cl, nullptr, nullptr);if(_cl)_cl->FinishedFrameBufferUpdate = nullptr;_cl = nullptr;}static void frameBufferUpdated(rfbClient* cl);protected:void run() override;private:bool _runFlag = false;rfbClient* _cl;signals:void updateImageSignal(QImage);
};#endif // VNCRECVTHREAD_H

项目完整代码

gitee:https://gitee.com/li-gouhi2333/vncclient/tree/master/

这篇关于libvncclient编写多线程qt的VNC客户端的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1136447

相关文章

MYSQL查询结果实现发送给客户端

《MYSQL查询结果实现发送给客户端》:本文主要介绍MYSQL查询结果实现发送给客户端方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql取数据和发数据的流程(边读边发)Sending to clientSending DataLRU(Least Rec

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt

Python FastMCP构建MCP服务端与客户端的详细步骤

《PythonFastMCP构建MCP服务端与客户端的详细步骤》MCP(Multi-ClientProtocol)是一种用于构建可扩展服务的通信协议框架,本文将使用FastMCP搭建一个支持St... 目录简介环境准备服务端实现(server.py)客户端实现(client.py)运行效果扩展方向常见问题结

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

Mybatis嵌套子查询动态SQL编写实践

《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言MyBATis的xml文件编写动态SQL

python多线程并发测试过程

《python多线程并发测试过程》:本文主要介绍python多线程并发测试过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、并发与并行?二、同步与异步的概念?三、线程与进程的区别?需求1:多线程执行不同任务需求2:多线程执行相同任务总结一、并发与并行?1、

C#使用MQTTnet实现服务端与客户端的通讯的示例

《C#使用MQTTnet实现服务端与客户端的通讯的示例》本文主要介绍了C#使用MQTTnet实现服务端与客户端的通讯的示例,包括协议特性、连接管理、QoS机制和安全策略,具有一定的参考价值,感兴趣的可... 目录一、MQTT 协议简介二、MQTT 协议核心特性三、MQTTNET 库的核心功能四、服务端(BR

Qt之QMessageBox的具体使用

《Qt之QMessageBox的具体使用》本文介绍Qt中QMessageBox类的使用,用于弹出提示、警告、错误等模态对话框,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.简单介绍3.常见函数4.按钮类型(QMessage::StandardButton)5.分步骤实现弹窗6.总结1.引言

Qt中Qfile类的使用

《Qt中Qfile类的使用》很多应用程序都具备操作文件的能力,包括对文件进行写入和读取,创建和删除文件,本文主要介绍了Qt中Qfile类的使用,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.QFile文件操作3.演示示例3.1实验一3.2实验二【演示 QFile 读写二进制文件的过程】4.