第四讲3远程屏幕监控系统

上传人:gp****x 文档编号:243010627 上传时间:2024-09-13 格式:PPT 页数:27 大小:110.50KB
返回 下载 相关 举报
第四讲3远程屏幕监控系统_第1页
第1页 / 共27页
第四讲3远程屏幕监控系统_第2页
第2页 / 共27页
第四讲3远程屏幕监控系统_第3页
第3页 / 共27页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第7讲 远程屏幕监控系统,教学目标与要求,:,了解远程屏幕监控的原理,了解图像压缩编码、解码的类及其实现,教学重点、难点:,1.,教学重点:,远程屏幕监控的原理,图像压缩编码、解码,使用,UDP,协议发送数据包,发送,/,接受鼠标和键盘控制命令并执行其操作指令,2.,教学难点:,图像压缩编码、解码,发送,/,接受鼠标和键盘控制命令并执行其操作指令,1,提问,:,处于局域网内的两台计算机,当一台计算机出现故障,由于地理位置及时间紧迫等因素,不便于直接去操作该台计算机,那么如何实现通过另一计算机对该台计算机进行直接的操作呢?,2,7.1,远程屏幕监控的原理,控制端(客户端程序)输入被控端(服务器端程序)的,IP,地址后,就可以抓取到被控端的屏幕图像,还可以对被控端进行远程操作。,3,7.2,系统结构设计,8.2.1,系统总体结构,1.,远程屏幕监控系统是一个客户机与服务器系统,程序分为服务器端和客户端两部分。其总体结构如下图所示:,4,2.,服务器端程序功能:,(1),发送自己的屏幕图像。,(2),接收客户端传来的控制命令,并执行相应的操作。,3.,服务器端程序结构:,(,如图,8.2,所示,),图,8.2,服务器端程序结构,5,4.,客户端程序功能:,(1),接收被控端(服务器)传来的屏幕图像。,(2),向被控端发送鼠标操作或键盘操作指令。,5.,客户端程序结构:,(,如图,8.3,所示,),6,7.2.2,常用类的介绍,1.,生成,JPEG,压缩图像编码、解码的类,在,com.sun.image.codec.jpeg,类包中,主要应用以下几个类:,(1)JPEGCodec:,执行,JPEG,图像编码的类。,(2) JPEGEncodeParam:,生成,JPEG,数据流的压缩编码类,并可对其实例化后的对象设置压缩的品质系统。其品质系统对压缩后生成图像的质量有很大影响,品质系数越小,压缩率越高,图像质量越差。反之,品质系数越大,压缩率越低,图像质量越好。,(3) JPEGDecodeParam:,对压缩的,JPEG,数据流进行解码的类。,7,2.,字节数组输入流,/,输出流,(1) ByteArrayInputStream(,字节数组输入流,),:包含一个内部缓冲区,该缓冲区存储从输入流中读取的字节。,ByteArrayInputStream(byte buf, int offset, int length),/,创建,ByteArrayInputStream,,使用,buf,作为其缓冲区数组。,(2) ByteArrayOutputStream(,字节数组输出流,),:将输出流中的数据被写入一个字节数组。缓冲区会随着数据的不断写入而自动增长。可使用,toByteArray(),和,toString(),检索数据。,ByteArrayOutputStream() /,创建一个新的字节数组输出流。,8,3.,关于,Robot,类控制鼠标和键盘事件的方法:,robot.mousePress(int button); /,被,控,端触发按下鼠标的动作事件,robot.mouseRelease(int button); /,被,控,端触发释放鼠标的动作事件,robot.mouseMove(int x,int y); /,被,控,端触发移动鼠标的动作事件,robot.mouseWheel(int button); /,被,控,端触发滚轮鼠标的动作事件,robot.keyPress(int code); /,被,控,端触发按下键盘的动作事件,robot.keyRelease(int code); /,被,控,端触发释放键盘的动作事件,其中,,robot,是,Robot,实例化的对象。,9,7.3,服务器端程序详细设计,1.,类名:,ServerTest,类功能:线程类,发送自己的屏幕图像,,并接受和执行 控制命令,方法,1,:,main(),功能:主函数,建立窗口并安排界面布局,调用线程,方法,2,:,ServerTest(),功能:构造方法,建立,UDP,数据报对象,方法,3,:,sendScreen(),功能:按,UDP,协议发送压缩的屏幕图像数据包,方法,4,:,run(),功能:接受和执行控制命令,10,3.,发送屏幕图像方法,sendScreen(),(1),工作流程:,11,(2),代码实现:,try ,BufferedImage image=robot.createScreenCapture(new Rectangle(toolkit.getScreenSize();,image=image.getSubimage(0,0,800,600); /,返回由指定矩形区域定义的子图像。,ByteArrayOutputStream output=new ByteArrayOutputStream(); /,创建字节数组输出流,/,将图像数据压缩为,JPEG,码的图像数据,JPEGEncodeParam param=JPEGCodec.getDefaultJPEGEncodeParam(image);,param.setQuality(0.3f,false); /,设置压缩率,12,/,将,JPEG,码的图像数据转到输出流,JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(output,param);,encoder.encode(image);,encoder.getOutputStream().close(); /,关闭当前与编码器关联的流,DatagramPacket packet=,new DatagramPacket(output.toByteArray(),output.size(),address); /,将图像数据打包,this.socket.send(packet); /,通过数据报套接字发送出去,System.out.println(+i+n);,catch (Exception e) e.printStackTrace();,13,4.,接受和执行控制命令的方法,run(),(1),工作流程:,14,15,(2) run(),在读取数据包指令内容时,按客户端发出来的,数据的结构顺序还原指令:,当判断出是,REFRESH,指令时,抓取自己的屏幕图像发送给控制端。,当判断出是键盘指令时,其数据的前,20,位数据是指令类型,第,2030,位数据是按键相对应的,Unicode,码,第,3040,位数据是按键值,第,4050,位数据是左、右键的位置。,当判断出是鼠标指令时,其数据的前,20,位数据是指令类型,第,2030,位数据是鼠标,X,坐标值,第,3040,位数据是鼠标,Y,坐标值,第,4050,位数据是左、右键的键值。,16,7.4,客户端程序详细设计,1.,类名:,ClientTest,类功能简介:发送控制指令,接收被控端传来的屏幕图,像进行解压,还原并显示图像,方法,1,:,main(),功能:主函数,建立输入被控端,IP,地址的窗口及显示被控,端屏幕图像窗口,并设置键盘监听,方法,2,:,ClientTest(),功能:构造方法,设置传送,UDP,数据报指令的参数,定义向,被控端发出截取屏幕图像指令的线程,定义监听鼠标事件,方法,3,:,run(),功能:接收被控端传来的屏幕图像数据,17,方法,4,:,getScreen(),功能:将接收到的屏幕图像数据进行解压,还原成图像,方法,5,:,sendKey(),功能:向被控端发送控制键盘事件的指令,方法,6,:,sendMouse(),功能:向被控端发送控制鼠标事件的指令,方法,7,:,paint(),功能:绘制被控端的屏幕图像,18,(2),方法调用关系:,19,2.,主函数,main(),在主函数中创建了一个输入被控端,IP,地址信息的窗体,,如图,8.7,所示:,窗口中安排了一个“确定”按钮,单击该按钮后,输入,IP,地址信息窗体将被隐藏,这时,弹出显示被控端屏幕图像的窗口。并通过线程,ClientTest(),向被控端发出截取屏幕图像的指令,从而能在窗口中显示被控端的屏幕图像。,图,8.7,输入被控端,IP,地址信息的窗体,20,3.,构造方法,ClientTest(),向被控端发送,REFRESH,字符串,其实就是向被控端发出截取屏幕图像的指令。,DatagramPacket packetsign=new,DatagramPacket(“REFRESH”.getBytes(),20);,Socket.send(packetsign);,然后调用线程,run(),方法来接收被控端传来的屏幕图像数据。,4.,线程,run(),方法,线程,run(),方法用于接收被控端传来的屏幕图像数据。,21,5.,还原屏幕图像方法,getScreen(),getScreen(),方法用于对接收到的屏幕图像数据进行解压,还原成图像。,JPEGImageDecoder decoder=JPEGCodec.createJPEGDecoder(input);,BufferedImage image=decoder.decodeAsBufferedImage();,this.image=image;,this.setPreferredSize(new Dimension(image.getWidth(),image.getHeight();,最后通过,panit(),方法将,image,图像显示出来。,22,6.,发送键盘指令方法,sendKey(),发送键盘指令的方法为:,void sendKey(int type,int code,char c,int location),其中定义了四个参数:, int type,为指令类型,判断是按下键还是释放键;, int code,为按键相对应的,Unicode,码;, char c,为按键值;, int location,为按键所在(左键、右键)位置。,23,在,sendKey(),方法中,构造了一个用于发送指令数据的,字节数组,bytes:,byte bytes=new byte50;,该数组有,50,个数组元素,前,20,位元素存放指令类型,第,2030,位元素存放按键相对应的,Unicode,码,第,3040,位元素存放按键,值,第,4050,位元素存放左、右键位置,如图,8.8,所示:,24,7.,发送控制鼠标事件的方法,sendMouse(),发送控制鼠标事件的方法为:,void sendMouse(int type,int x,int y,int button),其中定义了四个参数:, int type,为指令类型,判断是单击鼠标、释放鼠标、移动鼠标还是滚动鼠标滚轮;, int x,、,y,为鼠标指针坐标位置;, int button,为单击鼠标左键或右键的键值。,25,在,sendMouse(),方法中构造的字节数组,bytes,,其数组有,50,个数组元素,前,20,位元素存放指令类型,第,2030,位元素存放鼠标指针,x,坐标值,第,3040,位元素存放鼠标指针,y,坐标值,第,4050,位元素存放左、右键的键值,如图,8.9,所示:,26,教学总结:,1.,一般将数据打包,都必须指定目的主机的,IP,地址和端口,,在本例中,我们看到,packet= new DatagramPacket(output.toByteArray(),output.size(),address);,address,是,SocketAdrress,类的对象,,socketAddress,类表示不带任何,协议附件的,Socket Address,,作为一个抽象类,应通过特定的、,协议相关的实现, SocketAddress,通常为,IP,地址,+,端口号。,2.,通常,网络上的数据都是以字节或字符流的形式传送,那么图,像数据怎样在网络上传输呢?本例中,我们将,JPEG,码的图像数据,转到字节数组输出流,然后再使用,UDP,协议将该输出流的数据进,行打包发送出去。,27,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!