#桌面共享#
实现一个软件,主机A与主机B之间进行通信,主机A将其桌面共享给主机B
分析
- 主机A与主机B通信,主机A为服务器,主机B为客户端,A向B实时发送A自己的桌面
- 服务器没有显示界面
- 客户端有显示界面,显示界面显示服务器发送过来的桌面数据
- 客户端应尽量做到显示流畅,中间不存在较大的滞后,闪烁
大致思路:
- 实现两个主机之间的通信,利用TCP方法
- 获取桌面
- 将桌面发送过去
愿景
- 再将这个软件深入,做到像TIM中的“远程桌面”一样,主机A将桌面发送给主机B后,主机B能够在自己的桌面中控制主机A
具体过程
- Day_0
实现抓取桌面,获得一张桌面图片 - Day_1
实现两机之间的通信 - Day_2
- Day_3
- Day_4
- Day_5
- Day_6
- Day_7
- Day_8
- Day_9
- Day_10
遇到的问题
-
如何将QPixmap文件保存到文件中
QPixmap m_pixmap = QPixmap::grabWindow(QApplication::desktop()->winId());//抓取当前窗口图片 m_pixmap.save("myDesktop.bmp","BMP");//保存图片,格式为.bmp
-
如何将QPixmap文件转换为二进制数据
QPixmap m_pixmap = QPixmap::grabWindow(QApplication::desktop()->winId()); m_pixmap.save("m_pixmap","BMP"); QByteArray myArray; QBuffer buffer(&myArray); buffer.open(QIODevice::WriteOnly); m_pixmap.save(&buffer,"BMP"); QFile picture("picture.bmp"); picture.open(QIODevice::WriteOnly | QIODevice::ReadOnly); picture.flush(); QDataStream out(&picture); for(int i = 0;i<myArray.size();i++){ out<<(quint8)myArray[i]; } picture.close();
-
QPixmap抓取到的屏幕截图达到3M,使用TcpSocket发送过去需要2s多的时间,造成存在较大滞后,实际显示变成了一张一张的图片更新
考虑解决方法:1、考虑使用QuaZip将图片压缩后进行传送,接收端接收到之后再进行解压显示。2、将图片本身大小进行更改,但这样会明显改变图片的清晰度。3、使用另一种网络传输协议,尽可能地提高数据的传输速度。
另外,Windows10中的画图板中,能够将.bmp格式的图片转化为.jpg格式的图片,实际能将3M的大小转化为100多KB字节大小,在这种大幅降低图片内存大小的情况下却没有对清晰度造成大幅的破坏,值得去找一找它的实现机制。 -
显示界面与后台数据的接收之间的冲突,后台数据的不断接收会造成显示界面的按钮无法实时响应,窗口本身也无法立即关闭。
考虑使用多线程解决。