VNC简介
VNC(Virtual Network Computing)是基于RFB(Remote Frame Buffer)协议的远程系统,C/S端口默认为5900,B/S端口默认为5800。
RFB (远程帧缓存) 是一个远程图形用户的简单协议,工作在帧缓存级别上,其传输的是像素数据是以XY为起点的方框数据,通过矩形图形数据组进行帧缓存的更新。另外更新是由客户端通过命令驱动的,也就是说更新只是服务器在响应客户端的请求时发生的,如果网络较差时,有些帧的缓存会忽略,这样能减少客户端对网络和绘制速度的要求。
远程桌面协议对比:
SPICE | VNC | RDP | |
---|---|---|---|
BIOS屏幕显示 | 能 | 能 | 不能 |
全彩支持 | 能 | 能 | 能 |
更改分辨率 | 能 | 能 | 能 |
多显示器 | 多显示器支持(高达4画面) | 只有一个屏幕 | 多显示器支持 |
图像传输 | 图像和图形传输 | 图像传输 | 图像和图形传输 |
视频播放支持 | GPU加速支持 | 不能 | GPU加速支持 |
音频传输 | 双向语音可以控制 | 不能 | 双向语音可以控制 |
鼠标控制 | 客户端服务器都可以控制 | 服务器端控制 | 服务器端控制 |
VNC作为一种远程桌面协议,常常用在嵌入式开发中,在嵌入式设备上运行vnc服务程序,即可在PC端远程控制。
QT环境要求
- QT版本需要
5.8
以上,可以下载相应版本的源码包,比如5.9.6.zip,解压之后,在qtbase/src/plugins/platforms
下可以看见有vnc
的源码
- 检查qt库安装目录下插件
plugins
文件夹中platforms
目录是否有vnc动态库libqvnc.so
1 | # ls /usr/lib/qt5.8/plugins/platforms/ |
注意:QT提供的VNC服务比较简单,只支持一些基本的功能,另外老版本的VNC中也有一些BUG可能会造成崩溃,所以最好还是尽量使用新版本。
使用教程
QT程序启动vnc服务
方式1:通过设置环境变量,改变程序的启动方式
配置QT程序的启动的方式
export QT_QPA_PLATFORM=vnc
方式2:启动程序时指定启动方式
启动参数
./test -platform vnc:size=800x600:port=12345
- size 分辨率
- port 服务端口号(不加则默认为5900)
- mmsize 物理尺寸
使用VNC客户端
市面上的VNC客户端有很多,常用的比如Realvnc,另外也有很多开源的项目:
常见问题
VNC远程控件显示尺寸大小不一致
物理尺寸不一致导致的,可以先查询本地显示下的物理尺寸,在设置VNC启动参数mmsize
1
2
3
4
5
6
7
8
9
10#分辨率
qDebug("w:%d h:%d",
QApplication::desktop()->screen()->width(),
QApplication::desktop()->screen()->height());
#DPI
qDebug("log-dpi:%f phy-dpi:%f",
app.primaryScreen()->logicalDotsPerInch(),
app.primaryScreen()->physicalDotsPerInch());
#物理尺寸
qDebug("phy-w:%f phy-h:%f", app.primaryScreen()->physicalSize().width(), app.primaryScreen()->physicalSize().height());
参考