利用Java 实现远程控制


邮局订阅号: 82-946 360 元 / 年 技 术 创 新 网 络 与 通 信 《 嵌入式系统应用精选 200 例》 您 的 论 文 得 到 两 院 院 士 关 注 中国自控网 利用 J ava 实现远程控制 The Im plem ent of Rem ote Control Software by using J ava (1. 辽宁石油化工大学;2. 大连海事大学)赵新慧 1 李文超 1 冯锡炜 2 Zhao,Xinhui Li,Wenchao Feng,Xiwei 摘要: 介 绍 了 远 程 控 制 的 原 理 , 详 细 地 叙 述 了 利 用 Java 实 现 远 程 控 制 软 件 的 程 序 设 计 方 法 和 要 点 , 并 给 出 了 要 点 的 具 体 实 现 方 法 。 关键词: 远程控制; Java; 客户机/服务器 中图分类号: TP393 文献标识码: A Abstract: The principle of remote control software is introduced. The method and technique to implement remote control software by using Java are recited in detail. The implements of key points are presented. Key words: Remote control; Java; Client/Server 文章编号:1008- 0570(2006)03- 3- 0137- 03 我们知道有一些软件( 如 NetMeeting, PcAnywhere 等) 可以实现远程控制, 通过共享桌面等形式, 对远程 主机做任何操作, 就像控制本地的机器一样。这种控 制技术在远程设备( 软件) 的维护、监控与故障诊断等 方面有广泛的应用前景。由于 Java 语言具有良好的跨 平台性, 用 Java 语言编写的软件具有“一次编写, 各处 运行”的特点, 所以, 利用 Java 实现远程控制软件具有 更广的实用性。笔者在开发一个网络型监控系统中, 使用 Client/Server 模式, 利用 Java 实现了远程控制软 件, 在 Win2000/Win98/Linux 和 jdk1.4.1(能处理鼠标滚 轮的事件) 环境下运行良好, 客户机的屏幕在 800× 600, 32 位真彩色的模式下, 在局域网中控制延时在 1 秒左右。现介绍一下设计原理和程序实现要点, 以供 同行们参考。 1 远程控制的原理 远程控制的原理是: 用户连接到网络上, 通过远 程访问的控制端程序发送控制端身份验证信息和与 远程主机连接的要求, 远程主机的被控端程序验证控 制端身份, 如果验证通过, 就与控制端建立连接, 并向 控制端发送验证通过和已建立连接的信息。这时, 控 制端便可通过控制端程序监控或向远程主机发送要 执行的指令, 而被控端程序则执行这些指令, 并把键 盘、鼠标指令和屏幕刷新传给控制端程序, 控制端程 序通过处理把主机屏幕等信息显示给用户看, 使得用 户就像亲自在远程主机上操作一样。如果没有通过身 份验证, 就不与控制端建立连接, 用户也就不能远程 控制主机了。 远程控制软件大都使用 C/S 模式。使用前需要将 控制端程序安装到控制端计算机上, 将被控端程序安 装到被控端计算机上。它的控制过程一般是先在控制 端上执行控制端程序, 像一个普通客户一样向被控端 计算机发出信号, 建立一个特殊的远程服务, 然后通 过这个远程服务, 使用各种远程控制功能发送远程控 制命令, 控制被控端计算机中各种应用程序的运行。 这 种 远 程 控 制 方 式 称 为 基 于 远 程 服 务 的 远 程 控 制 (RemoteControloverRemoteService)。 2 用 Java 实现远程控制 2.1 总体设计 为了实现远程控制, 被控端程序需要不断地把屏 幕图象发送到控制端, 并接收来自控制端的鼠标和键 盘操作指令, 然后按操作指令执行。控制端程序需要 不断地接收被控端程序发送的屏幕图象, 然后在控制 端窗口中显示, 并捕捉控制端的鼠标和键盘事件, 然后 传送到被控端。双方整个交互过程模型如图 1 所示。 2.2 所用到的 java 的包、类及方法介绍 用 到 的 包 有 java.lang, java.io, java.awt, java.awt. event,java.awt.image,javax.swing, java.net 和 com.sun.im- age.codec.jpeg。重要的类有 Robot(事件模拟类)、Toolkit (工具箱类)、JPEGCodec(jpeg 图象编码/解码类)、UIMan- 赵新慧:讲师 基金项目: 辽宁省教育厅高等学校科学研究项目: 采 场模糊渗流理论与瓦斯非稳定涌出灾害的研究。编 号: 2004C034              1  137- - 技 术 创 新 中 文 核 心 期 刊《微 计 算 机 信 息 》(管 控 一 体 化)2006 年 第 22 卷 第 3-3 期 360元 / 年 邮局订阅号: 82-946 《 PLC 技术应用 200 例》 网 络 与 通 信 ager(界面管理类)、Socket(套接字类)、ServerSocket(服务 器套接字类)和 InetAddress(Internet 地址类)。 Robot 类的重要方法有 createScreenCapture(Rect- angle screenRect)、mousePress (int buttons)、mouseRe- lease (int buttons)、mouseMove (int x, int y)、mouseWheel (int wheelAmt)、keyPress (int keycode) 和 keyRelease (int keycode) , 功能分别是捕获屏幕图象、按下 鼠标 键、松开鼠标键、移动鼠标键、旋转鼠标滚动轮、按下 一特定键和松开一特定键。Toolkit 类的重要方法有 getDefaultToolkit().getScreenSize()和 getDefaultToolkit(). addAWTEventListener(), 功能分别是得到屏幕的大小 和把窗口事件处理委托给某个听众。 2.3 程序设计实现要点 2.3.1 鼠标和键盘事件的获取及操作模拟 客户端程序需要不断地接收服务器端程序发送 的屏幕图象, 然后在客户端窗口中显示, 并捕捉客户 端在屏幕图象显示窗口中用户发出的鼠标和键盘指 令。对于鼠标指令, 可以通过让窗口组件对象把自己 作为鼠标和鼠标运动听众加入来获得, 具体如下: //加入鼠标听众 this.addMouseListener(new MouseListener(){ public void mousePressed(MouseEvent e) { //向 被 控 端 发 送 MOUSE_PRESSED,e.getX(),e. getY(),e.getButton() } public void mouseReleased(MouseEvent e) { //向被控端发送 MOUSE_RELEASED,e.getX(), e.getY(),e.getButton() } }); //加入鼠标运动听众 this.addMouseMotionListener (new MouseMotionLis- tener(){ public void mouseDragged(MouseEvent e) { //向 被 控 端 发 送 MOUSE_DRAGGED,e.getX(),e. getY(),e.getButton() } public void mouseMoved(MouseEvent e) { //向被控端发送 MOUSE_MOVED,e.getX(),e.getY (),e.getButton() } }); this.addMouseWheelListener (new MouseWheelLis- tener(){ public void mouseWheelMoved(MouseWheelEvent e) { //向被控端发送 MOUSE_WHEELMOVED,e.getX (),e.getY(),e.getUnitsToScroll() } }); 对于键盘指令, 可以让窗口把自己作为听众加入 来获得, 具体如下: Toolkit.getDefaultToolkit ().addAWTEventListener (new AWTEventListener(){ public void eventDispatched(AWTEvent event) { KeyEvent e = (KeyEvent)event; if(e.getID()= =KeyEvent.KEY_PRESSED) { //向 被 控 端 发 送 KEY_PRESSED,e.getKey- Code(),e.getKeyChar(),e.getKeyLocation() } else if(e.getID()==KeyEvent.KEY_RELEASED) { //向 被 控 端 发 送 KEY_RELEASED,e.getKey- Code(),e.getKeyChar(),e.getKeyLocation() } } },AWTEvent.KEY_EVENT_MASK); 被控端程序接收来自控制端的鼠标和键盘操作 指令后, 可以根据具体指令执行 Robot 类的相应方法 即可实现操作模拟( 参见 2.2) 。需要说明的是, 控制端 程序需要根据被控端程序发送的屏幕图象的大小来 设置显示被控端屏幕图象的窗口组件的大小, 这样, 被控端程序收到控制端程序发送的鼠标坐标就可以 准确定位本地鼠标位置。 2.3.2 屏幕图象的压缩/解压缩 屏幕图象是以位图格式获得的, 直接传输会造成 比较大的延时, 为了提高远程控制的实时性, 需要对 获取的屏幕图象数据进行压缩后再传输, 另外, 不应 该使用文件的形式进行屏幕图象传输, 而是应该直接 传输内存数据, 这样也会明显地减小延时。屏幕图象 的压缩方法如下: //获取屏幕图象 BufferedImage image =robot.createScreenCapture (new Rectangle(toolkit.getScreenSize())); ByteArrayOutputStream out =new ByteArrayOutput- Stream();//建立输出流 //创建 JPEGEncodeParam 对象 ( 封装了压缩所需 必要参数) JPEGEncodeParam param =JPEGCodec.getDefault- 138- - 邮局订阅号: 82-946 360 元 / 年 技 术 创 新 网 络 与 通 信 《 嵌入式系统应用精选 200 例》 您 的 论 文 得 到 两 院 院 士 关 注 中国自控网 JPEGEncodeParam(image); param.setQuality(0.5f,false); //设置压缩后清晰度( 数值 范围 0— 1 之间) //创建 JPEGImageEncoder 对象 JPEGImageEncoder encoder=JPEGCodec.createJPE- GEncoder(out,param); encoder.encode(image); //图象压缩 byte[] bytes=out.toByteArray(); //生成位数组 output.write(bytes,0,bytes.length); // 把位数组写入 输出流 output.flush(); //刷新输出流 压缩后的屏幕图象数据的解压缩方法如下: //创建 JPEGImageDecoder 对象, input 为输入流 JPEGImageDecoder decoder =JPEGCodec.create- JPEGDecoder(input); //把 JPEG 数据流解压缩 BufferedImage image=decoder.decodeAsBufferedIm- age(); //显示图象 2.3.3 屏幕图象及指令的传输 在 TCP/IP 协议组中, TCP 是 一种面向连 接 的 协 议, 为用户提供可靠的、全双工的流式服务, 具有确 认、流控制、多路复用和同步等功能, 适用于多种不同 数据类型的传榆。UDP 协议则是无连接的, 每个分组 携带完整的目的地址, 各分组在系统中独立传送。它 不能保证分组的先后顺序, 不进行分组出错的恢复与 重传, 因此不保证传输的可靠性, 但是它提供高传输 效率的数据报服务, 适于实时的语音、图像、广播消息 等网络传输。 在选择传输协议时, 屏幕图象的压缩率是一个重 要因素。因为 UDP 协议的数据包最大长度是 64KB, 如 果屏幕图象的压缩率设置得比较小, 屏幕图象压缩后 的数据量超过了 64KB, 那么, 就不宜使用 UDP 协议。 一般地, 屏幕图象的压缩率设置得不宜太大( 设置压 缩后的清晰度要≥ 0.5) , 否则, 传到客户端的屏幕图象 会不够清晰, 所以, 一般可以选择使用 TCP 协议。网络 通讯是普遍的编程技术, 在这里简要介绍实现步骤: 服务器端: //在 PORT 端口侦听 ServerSocket server=new ServerSocket(PORT); //接受客户机连接请求 Socket client=server.accept(); //与客户机建立输入输出流 BufferedOutputStream output = new BufferedOut- putStream (client.getOutputStream(), BUFFER_SIZE); BufferedReader input = new BufferedReader (new InputStreamReader (client.getInputStream())); //进行数据传输 ... ... 客户端: //与服务器连接 Socket client= new Socket(server,PORT); //与服务器建立输入输出流 PrintWriter output = new PrintWriter(client.getOut- putStream(),true); BufferedInputStream input = new BufferedInput- Stream(client.getInputStream(), BUFFER_SIZE); //进行数据传输 ... ... 另外, 由于服务器端屏幕图象的获取、压缩和传 输以及客户端屏幕图象的接收、解压缩和显示需要不 断地、频繁地进行, 所以, 程序的设计需要采用多线程 技术, 服务器端屏幕图象的获取、压缩和传输以及客 户端屏图象的接收、解压缩和显示应该分别由一个专 门的线程来处理。多线程的使用, 限于篇幅不在赘述。 3 结束语 本文介绍了远程控制的原理, 详细地叙述了利用 Java 实现远程控制软件的程序设计方法和要点, 并给 出了要点的具体实现方法。为了使所实现的软件具有 更好的实用性, 可以把软件设计成支持 TCP 和 UDP 两种协议, 让用户在使用时自己设置所要使用的协议 和屏幕图象压缩率大小。 参考文献: [1]施博学,王志良,刘冀伟. 基于 RTP 实时远程图像传输研究与 实现[J],微计算机信息, 2005,2:178- 180. [2]Spell B. Java 专业编程指南[M]. 北京: 电子工业出版社, 2001. [3]Eckel B. Java 编程思想( 英文版,第三版) [M]. 北京: 机械工业 出版社, 2004. 作者简介: 赵新慧( 1973- ) , 男, 山东平度人, 讲师, 硕 士, 主要研究方向: 计算机网络与信息处理。Email: zhaoxinhui2002@163.com,zhao_xinhui0488@sina.com (113001 辽宁抚顺 辽宁石油化工大学信息工程学院 计算机科学与技术系) 赵新慧 李文超 (116026 辽宁大连 大连海事大学航海技术研究所) 冯锡炜 (Dept. of Computer Science & Technology, College of Information Engineering, Liaoning University of Petroleum &Chemical Technology, Fushun Liaoning 113001, China) Zhao,Xinhui Li,Wenchao (Institute of Nautical Technology, Dalian Maritime University , Liaoning Dalian 116026,China) Feng,Xi- wei 通信地址: (113001 辽宁抚顺 辽宁石油化工大学信息工程学院 计算机系教研室) 赵新慧 (投稿日期:2005.8.11) (修稿日期:2005.8.21) 您 的 论 文 得 到 两 院 院 士 关 注 139- -
还剩2页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 1 人已下载

下载pdf