利用Java实现远程控制_第1页
利用Java实现远程控制_第2页
利用Java实现远程控制_第3页
利用Java实现远程控制_第4页
利用Java实现远程控制_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、利用Java实现远程控制摘要: 介绍了远程控制的原理,详细地叙述了利用Java实现远程控制软件的程序设计方法和要点,并给出了要点的具体实现方法。关键词: 远程控制;Java;客户机/服务器The Implement of Remote Control Software by using JavaAbstract: The principle of remote control software is introduced. The method and technique to implement remote control software by using Java are recite

2、d in detail. The implements of key points are presented.Key words: Remote control; Java; Client/Server我们知道有一些软件(如NetMeeting,PcAnywhere等)可以实现远程控制,通过共享桌面等形式,对远程主机做任何操作,就像控制本地的机器一样。这种控制技术在远程设备(软件)的维护、监控与故障诊断等方面有广泛的应用前景。由于Java语言具有良好的跨平台性,用Java语言编写的软件具有“一次编写,各处运行”的特点,所以,利用Java实现远程控制软件具有更广的实用性。笔者在开发一个网络型监

3、控系统中,使用ClientServer模式,利用Java实现了远程控制软件,在Win2000/Win98/Linux和jdk1.4.1(能处理鼠标滚轮的事件) 环境下运行良好,客户机的屏幕在800×600,32位真彩色的模式下,在局域网中控制延时在1秒左右。现介绍一下设计原理和程序实现要点,以供同行们参考。1 远程控制的原理远程控制的原理1是:用户连接到网络上,通过远程访问的控制端程序发送控制端身份验证信息和与远程主机连接的要求,远程主机的被控端程序验证控制端身份,如果验证通过,就与控制端建立连接,并向控制端发送验证通过和已建立连接的信息。这时,控制端便可通过控制端程序监控或向远程主

4、机发送要执行的指令,而被控端程序则执行这些指令,并把键盘、鼠标指令和屏幕刷新传给控制端程序,控制端程序通过处理把主机屏幕等信息显示给用户看,使得用户就像亲自在远程主机上操作一样。如果没有通过身份验证,就不与控制端建立连接,用户也就不能远程控制主机了。远程控制软件大都使用CS模式。使用前需要将控制端程序安装到控制端计算机上,将被控端程序安装到被控端计算机上。它的控制过程一般是先在控制端上执行控制端程序,像一个普通客户一样向被控端计算机发出信号,建立一个特殊的远程服务,然后通过这个远程服务,使用各种远程控制功能发送远程控制命令,控制被控端计算机中各种应用程序的运行。这种远程控制方式称为基于远程服务

5、的远程控制(RemoteControloverRemoteService)。2 用Java实现远程控制2.1 总体设计为了实现远程控制,被控端程序需要不断地把屏幕图象发送到控制端,并接收来自控制端的鼠标和键盘操作指令,然后按操作指令执行。控制端程序需要不断地接收被控端程序发送的屏幕图象,然后在控制端窗口中显示,并捕捉控制端的鼠标和键盘事件,然后传送到被控端。双方整个交互过程模型如图1所示。图象显示通信鼠标和键盘事件获取通信屏幕截取通信鼠标和键盘事件模拟通信控制端被控端图 1 远程控制交互过程模型2.2 所用到的java的包、类及方法介绍用到的包有java.lang, java.io, java

6、.awt, java.awt.event,java.awt.image,javax.swing, 和com.sun.image.codec.jpeg。重要的类有Robot(事件模拟类)、Toolkit(工具箱类)、JPEGCodec(jpeg图象编码/解码类)、UIManager(界面管理类)、Socket(套接字类)、ServerSocket(服务器套接字类)和InetAddress(Internet地址类)。Robot类的重要方法有createScreenCapture(Rectangle screenRect)、mousePress (int buttons)、mouseRel

7、ease (int buttons)、mouseMove (int x, int y)、mouseWheel (int wheelAmt)、keyPress (int keycode) 和keyRelease (int keycode) ,功能分别是捕获屏幕图象、按下鼠标键、松开鼠标键、移动鼠标键、旋转鼠标滚动轮、按下一特定键和松开一特定键。Toolkit类的重要方法有getDefaultToolkit().getScreenSize()和getDefaultToolkit().addAWTEventListener(),功能分别是得

8、到屏幕的大小和把窗口事件处理委托给某个听众。2.3 程序设计实现要点2.3.1鼠标和键盘事件的获取及操作模拟客户端程序需要不断地接收服务器端程序发送的屏幕图象,然后在客户端窗口中显示,并捕捉客户端在屏幕图象显示窗口中用户发出的鼠标和键盘指令。对于鼠标指令,可以通过让窗口组件对象把自己作为鼠标和鼠标运动听众加入来获得,具体如下:/加入鼠标听众this.addMouseListener(new MouseListener() public void mousePressed(MouseEvent e) /向被控端发送MOUSE_PRESSED,e.getX(),e.getY(),e.getButt

9、on() public void mouseReleased(MouseEvent e) /向被控端发送MOUSE_RELEASED,e.getX(),e.getY(),e.getButton() ); /加入鼠标运动听众this.addMouseMotionListener(new MouseMotionListener() public void mouseDragged(MouseEvent e) /向被控端发送MOUSE_DRAGGED,e.getX(),e.getY(),e.getButton() public void mouseMoved(MouseEvent e) /向被控端发

10、送MOUSE_MOVED,e.getX(),e.getY(),e.getButton() ); this.addMouseWheelListener(new MouseWheelListener() public void mouseWheelMoved(MouseWheelEvent e) /向被控端发送MOUSE_WHEELMOVED,e.getX(),e.getY(),e.getUnitsToScroll() ); 对于键盘指令,可以让窗口把自己作为听众加入来获得,具体如下:Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEv

11、entListener() public void eventDispatched(AWTEvent event) KeyEvent e = (KeyEvent)event; if(e.getID()= =KeyEvent.KEY_PRESSED) /向被控端发送KEY_PRESSED,e.getKeyCode(),e.getKeyChar(),e.getKeyLocation()else if(e.getID()= =KeyEvent.KEY_RELEASED) /向被控端发送KEY_RELEASED,e.getKeyCode(),e.getKeyChar(),e.getKeyLocatio

12、n() ,AWTEvent.KEY_EVENT_MASK); 被控端程序接收来自控制端的鼠标和键盘操作指令后,可以根据具体指令执行Robot类的相应方法即可实现操作模拟(参见2.2)。需要说明的是,控制端程序需要根据被控端程序发送的屏幕图象的大小来设置显示被控端屏幕图象的窗口组件的大小,这样,被控端程序收到控制端程序发送的鼠标坐标就可以准确定位本地鼠标位置。2.3.2屏幕图象的压缩/解压缩屏幕图象是以位图格式获得的,直接传输会造成比较大的延时,为了提高远程控制的实时性,需要对获取的屏幕图象数据进行压缩后再传输,另外,不应该使用文件的形式进行屏幕图象传输,而是应该直接传输内存数据,这样也会明显地

13、减小延时。屏幕图象的压缩方法如下:/获取屏幕图象BufferedImage image=robot.createScreenCapture(new Rectangle(toolkit.getScreenSize(); ByteArrayOutputStream out=new ByteArrayOutputStream();/建立输出流/创建JPEGEncodeParam对象(封装了压缩所需必要参数)JPEGEncodeParam param=JPEGCodec.getDefaultJPEGEncodeParam(image); param.setQuality(0.5f,false); /设

14、置压缩后清晰度(数值范围01之间)/创建JPEGImageEncoder对象JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(out,param);encoder.encode(image); /图象压缩byte bytes=out.toByteArray(); /生成位数组output.write(bytes,0,bytes.length); / 把位数组写入输出流output.flush(); /刷新输出流压缩后的屏幕图象数据的解压缩方法如下:/创建JPEGImageDecoder对象,input为输入流JPEGImageDecode

15、r decoder=JPEGCodec.createJPEGDecoder(input); /把JPEG数据流解压缩BufferedImage image=decoder.decodeAsBufferedImage(); /显示图象2.3.3屏幕图象及指令的传输在TCPIP协议组中,TCP是一种面向连接的协议,为用户提供可靠的、全双工的流式服务,具有确认、流控制、多路复用和同步等功能,适用于多种不同数据类型的传榆。UDP协议则是无连接的,每个分组携带完整的目的地址,各分组在系统中独立传送。它不能保证分组的先后顺序,不进行分组出错的恢复与重传,因此不保证传输的可靠性,但是它提供高传输效率的数据报

16、服务,适于实时的语音、图像、广播消息等网络传输。在选择传输协议时,屏幕图象的压缩率是一个重要因素。因为UDP协议的数据包最大长度是64KB2,如果屏幕图象的压缩率设置得比较小,屏幕图象压缩后的数据量超过了64KB,那么,就不宜使用UDP协议。一般地,屏幕图象的压缩率设置得不宜太大(设置压缩后的清晰度要0.5),否则,传到客户端的屏幕图象会不够清晰,所以,一般可以选择使用TCP协议。网络通讯是普遍的编程技术3,在这里简要介绍实现步骤:服务器端:/在PORT端口侦听ServerSocket server=new ServerSocket(PORT); /接受客户机连接请求Socket client

17、=server.accept(); /与客户机建立输入输出流BufferedOutputStream output = new BufferedOutputStream (client.getOutputStream(), BUFFER_SIZE);BufferedReader input = new BufferedReader (new InputStreamReader (client.getInputStream();/进行数据传输. . 客户端:/与服务器连接Socket client= new Socket(server,PORT);/与服务器建立输入输出流PrintWriter

18、output = new PrintWriter(client.getOutputStream(),true);BufferedInputStream input = new BufferedInputStream(client.getInputStream(), BUFFER_SIZE);/进行数据传输. . 另外,由于服务器端屏幕图象的获取、压缩和传输以及客户端屏幕图象的接收、解压缩和显示需要不断地、频繁地进行,所以,程序的设计需要采用多线程技术4,服务器端屏幕图象的获取、压缩和传输以及客户端屏图象的接收、解压缩和显示应该分别由一个专门的线程来处理。多线程的使用,限于篇幅不在赘述。3 结束语本文介绍了远程控制的原理,详细地叙述了利用Jav

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论