【教学课件】第18章远程控制软件制作.ppt
第18章 远程控制软件制作,本章将结合前面学过的网络编程相关知识与GDI相关知识来开发一个远程监控程序,完成基本的远程控制功能。如果在此程序中添加文件传输、远程终端等功能,程序会更加完美。,18.1 案例效果图,程序界面非常简单,服务器端使用控制台应用程序,而客户端则是简单的文档程序。客户端可以查看服务端的桌面情况,并将桌面的图像显示在视图窗口中。客户端程序最终的运行效果如图所示。,18.2 案例需求和知识点,在正式学习案例前,先了解本章案例要实现的内容,同时对需要的一些知识点进行初步的了解。,18.2.1 案例需求,开发远程桌面程序,要求完成以下功能。填写远程服务端IP地址,如果连接成功可以查看到远程桌面的图像。服务端采用控制台程序开发。客户端采用文档程序开发。客户端在控制屏幕中可以用鼠标控制远程电脑。,18.2.2 需要掌握的知识点,编写本章中的程序需要掌握以下几方面的知识点。单文档应用程序的开发方法,在视图窗口显示服务器桌面图像。网络编程select I/O模型使用。GDI相关知识,绘制图像。图像传输优化方法。鼠标动作模拟方法。,18.3 图像传输优化方法,由于图像数据比较大,所以在传输过程中需要采取一些手段,让传输的数据量越小越好。常用的手段有数据压缩(将图像数据压缩后传输,到客户端后解压显示。由于压缩算法篇幅比较大也比较难懂,所以本案例没有添加此处理)、图像分块(将图像分块,传输过程中只传输变化的几个块。有些块的图像没有变则不传输,减少传输量)。本章将通过图像分块方式来减少图像传输量。,18.4 模拟鼠标动作,使用API函数mouse_event可以模拟鼠标动作,mouse_event函数的定义如下。VOID mouse_event(DWORD dwFlags,/标记,表示模拟什么动作DWORD dx,/动作发生的x坐标DWORD dy,/动作发生的y坐标DWORD dwData,/通常不使用DWORD dwExtraInfo/通常不使用);,18.5 开发过程,程序主要分为两大块,即客户端部分与服务端部分。下面分别阐述两部分的开发方法与步骤。,18.5.1 服务端结构分析,服务端使用select模型接收客户数据,并根据数据类型调用相关方法进行处理。服务端的流程如图所示。,18.5.2 GDI结构与链表设计,前面曾经讨论过如何减少图像传输量。本案例采取对图像进行分块的方式减少传输量。每块图像的信息用一个GDI结构体保存,GDI结构体定义如下。,18.5.3 初始化GDI链表与清理GDI链表,服务端应首先初始化GDI链表,然后再对各个元素进行操作。初始化GDI链表由InitDisplay完成,其相应代码如下。,18.5.4 启动服务接收网络事件,初始化GDI链表之后便可操作网络事件。StartService用来加载Winsock库,并在指定端口监听。当有新客户端连接到来时,接收连接并使用HandleIO处理READ事件。StartService与HandleIO的定义如下。,18.5.5 保证发送接收大小,使用recv和send方法传输数据时,不一定会将数据全部传递出去。recv和send的返回值表示实际传输大小。为了确保数据能够准确地接收和发送,下面定义2个函数recv_n与send_n,用来完成以上操作。recv_n与send_n的定义如下。,18.5.6 通信协议设计,为了使服务器与客户端能够通信,必须为双方定义一个通信协议。只有双方按照指定的通信协议通信,才能完成预期的功能。服务器与客户端都有一个“proto.h”,“proto.h”中定义了协议相关信息,具体内容如下。,18.5.7 发送图像数据,发送图像数据使用SendRegionDisplay函数。在发送图像数据之前,首先要调用GetRegionDisplay,得到当前桌面图像,然后将发生变化的图像个数发送给客户端。当客户端接收到发送个数后会循环地接收图像数据,此时SendRegionDisplay将图像数据循环发送出去。SendRegionDisplay与GetRegionDisplay的定义如下。,18.5.8 客户端结构分析,至此,服务器端的主要代码已经开发完毕,客户端的主要流程如图所示。,18.5.9 客户端创建,创建单文档程序,并在应用程序向导第4步中去掉“Docking toolbar”、“Initial status bar”、“Pringting and print preview”等复选框的选择,如图所示。在应用程序向导第6步,选择视图类的基类为CScrollView(方便滚动屏幕)。,18.5.10 客户端GDI结构与链表,客户端的GDI结构要比服务端的GDI结构简单,因为服务端需要做一些运算处理。客户端的GDI结构及链表定义如下。(详细内容请参照本书),18.5.11 连接服务器,连接服务器之前,首先需要为视图类添加一些成员,以便以后使用。相应代码如下。(详细内容请参照本书),18.5.12 获取及显示远程图像,UpdateRegionalScreen可以向服务器发送REQUESTID_REFRESH消息,然后接收服务器发送过来的图像。其具体代码如下。(详细内容请参照本书),18.5.13 发送鼠标事件,前面已经完成了图像传输部分,下面为程序添加鼠标控制代码。当用户在视图窗口中输入鼠标动作时,应将鼠标动作发送到远程服务器。本例将发送鼠标左键按下、鼠标左键抬起、鼠标右键按下、鼠标右键抬起4个消息。添加以上4个鼠标事件的消息函数,并编写代码如下。(详细内容请参照本书),18.6 小结,至此,整个远程控制程序的主要代码已经编写完毕。在此基础上添加一些其他控制命令与压缩算法便可将程序扩充为真正的远程控制程序。程序中最为复杂的就是DDB到DIB之间转化的过程。但这不是本章的重点,本章的目的是通过远程控制程序练习通信协议的定义方法。在以后的开发过程中会遇到各种各样的协议,如何定义出高效的协议是网络通信编程的基础。,