利用Java实现远程控制

更新时间:2024-02-03 18:29:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

利用Java实现远程控制

摘 要: 介绍了远程控制的原理,详细地叙述了利用Java实现远程控制软件的程序设计方法和要点,并给出了要点的具体实现方法。

关键词: 远程控制;Java;客户机/服务器 The Implement of Remote Control Software by using Java 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

我们知道有一些软件(如NetMeeting,PcAnywhere等)可以实现远程控制,通过共享桌面等形式,对远程主机做任何操作,就像控制本地的机器一样。这种控制技术在远程设备(软件)的维护、监控与故障诊断等方面有广泛的应用前景。由于Java语言具有良好的跨平台性,用Java语言编写的软件具有“一次编写,各处运行”的特点,所以,利用Java实现远程控制软件具有更广的实用性。笔者在开发一个网络型监控系统中,使用Client/Server模式,利用Java实现了远程控制软件,在Win2000/Win98/Linux和jdk1.4.1(能处理鼠标滚轮的事件) 环境

________________________________________________________________________________________ 1

下运行良好,客户机的屏幕在800×600,32位真彩色的模式下,在局域网中控制延时在1秒左右。现介绍一下设计原理和程序实现要点,以供同行们参考。 1 远程控制的原理

远程控制的原理[1]是:用户连接到网络上,通过远程访问的控制端程序发送控制端身份验证信息和与远程主机连接的要求,远程主机的被控端程序验证控制端身份,如果验证通过,就与控制端建立连接,并向控制端发送验证通过和已建立连接的信息。这时,控制端便可通过控制端程序监控或向远程主机发送要执行的指令,而被控端程序则执行这些指令,并把键

盘、鼠标指令和屏幕刷新传给控制端程序,控制端程序通过处理把主机屏幕等信息显示给用户看,使得用户就像亲自在远程主机上操作一样。如果没有通过身份验证,就不与控制端建立连接,用户也就不能远程控制主机了。

远程控制软件大都使用C/S模式。使用前需要将控制端程序安装到控制端计算机上,将被控端程序安装到被控端计算机上。它的控制过程一般是先在控制端上执行控制端程序,像一个普通客户一样向被控端计算机发出信号,建立一个特殊的远程服务,然后通过这个远程服务,使用各种远程控制功能发送远程控制命令,控制被控端计算机中各种应用程序的运行。这种远程控制方式称为基于远程服务的远程控制(RemoteControloverRemoteService)。

________________________________________________________________________________________ 2

2 用Java实现远程控制 2.1 总体设计

为了实现远程控制,被控端程序需要不断地把屏幕图象发送到控制端,并接收来自控制端的鼠标和键盘操作指令,然后按操作指令执行。控制端程序需要不断地接收被控端程序发送的屏幕图象,然后在控制端窗口中显示,并捕捉控制端的鼠标和键盘事件,然后传送到被控端。双方整个交互过程模型如图1所示。

控制端

图象显示 鼠标和键盘事件获取 被控端

鼠标和键盘事件模拟 屏幕截取 通信 通信 通信 通信 图 1 远程控制交互过程模型

2.2 所用到的java的包、类及方法介绍

java.lang,

java.io, java.net

java.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)、mouseRelease (int buttons)、mouseMove (int x, int y)、mouseWheel (int wheelAmt)、keyPress

3

(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() }

4

});

//加入鼠标运动听众

this.addMouseMotionListener(new MouseMotionListener(){ 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 MouseWheelListener(){ public void mouseWheelMoved(MouseWheelEvent e) { //

MOUSE_WHEELMOVED,e.getX(),e.getY(),e.getUnitsToScroll() } });

对于键盘指令,可以让窗口把自己作为听众加入来获得,具体如下:

Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener(){

5

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.getKeyLocation()

} }

},AWTEvent.KEY_EVENT_MASK);

被控端程序接收来自控制端的鼠标和键盘操作指令后,可以根据具体指令执行Robot类的相应方法即可实现操作模拟(参见2.2)。需要说明的是,控制端程序需要根据被控端程序发送的屏幕图象的大小来设置显示被控端屏幕图象的窗口组件的大小,这样,被控端程序收到控制端程序发送的鼠标坐标就可以准确定位本地鼠标位置。

2.3.2屏幕图象的压缩/解压缩

屏幕图象是以位图格式获得的,直接传输会造成比较大的延

6

时,为了提高远程控制的实时性,需要对获取的屏幕图象数据进行压缩后再传输,另外,不应该使用文件的形式进行屏幕图象传输,而是应该直接传输内存数据,这样也会明显地减小延时。屏幕图象的压缩方法如下: //获取屏幕图象 BufferedImage

image=robot.createScreenCapture(new

Rectangle(toolkit.getScreenSize()));

ByteArrayOutputStream out=new ByteArrayOutputStream();//建立输出流

//创建JPEGEncodeParam对象(封装了压缩所需必要参数) JPEGEncodeParam

param=JPEGCodec.getDefaultJPEGEncodeParam(image); param.setQuality(0.5f,false); //设置压缩后清晰度(数值范围0—1之间)

//创建JPEGImageEncoder对象 JPEGImageEncoder

encoder=JPEGCodec.createJPEGEncoder(out,param); encoder.encode(image); //图象压缩

byte[] bytes=out.toByteArray(); //生成位数组

output.write(bytes,0,bytes.length); // 把位数组写入输出流 output.flush(); //刷新输出流

压缩后的屏幕图象数据的解压缩方法如下:

7

//创建JPEGImageDecoder对象,input为输入流 JPEGImageDecoder

decoder=JPEGCodec.createJPEGDecoder(input); //把JPEG数据流解压缩

BufferedImage image=decoder.decodeAsBufferedImage(); //显示图象

2.3.3屏幕图象及指令的传输

在TCP/IP协议组中,TCP是一种面向连接的协议,为用户提供可靠的、全双工的流式服务,具有确认、流控制、多路复用和同步等功能,适用于多种不同数据类型的传榆。UDP协议则是无连接的,每个分组携带完整的目的地址,各分组在系统中独立传送。它不能保证分组的先后顺序,不进行分组出错的恢复与重传,因此不保证传输的可靠性,但是它提供高传输效率的数据报服务,适于实时的语音、图像、广播消息等网络传输。

在选择传输协议时,屏幕图象的压缩率是一个重要因素。因为UDP协议的数据包最大长度是64KB[2],如果屏幕图象的压缩率设置得比较小,屏幕图象压缩后的数据量超过了64KB,那么,就不宜使用UDP协议。一般地,屏幕图象的压缩率设置得不宜太大(设置压缩后的清晰度要≥0.5),否则,传到客户端的屏幕图象会不够清晰,所以,一般可以选择使用TCP协议。网络通讯是普遍的编程技术[3],在这里简要介绍实现步骤:

8

服务器端: //在PORT端口侦听

ServerSocket server=new ServerSocket(PORT); //接受客户机连接请求 Socket client=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 output = new PrintWriter(client.getOutputStream(),true); BufferedInputStream

input

=

new

BufferedInputStream(client.getInputStream(), BUFFER_SIZE); //进行数据传输 ... ...

另外,由于服务器端屏幕图象的获取、压缩和传输以及客户

9

端屏幕图象的接收、解压缩和显示需要不断地、频繁地进行,所以,程序的设计需要采用多线程技术[4],服务器端屏幕图象的获取、压缩和传输以及客户端屏图象的接收、解压缩和显示应该分别由一个专门的线程来处理。多线程的使用,限于篇幅不在赘述。 3 结束语

本文介绍了远程控制的原理,详细地叙述了利用Java实现远程控制软件的程序设计方法和要点,并给出了要点的具体实现方法。为了使所实现的软件具有更好的实用性,可以把软件设计成支持TCP和UDP两种协议,让用户在使用时自己设置所要使用的协议和屏幕图象压缩率大小。 参 考 文 献

[1] 常永昌.一种远程控制软件的设计与实现[J].计算机应用,

2003,23(3):127-128,131.

[2] Andrew S. 计算机网络(第3版)[M]. 北京:清华大学出

版社,2002.

[3] Spell B. Java专业编程指南[M]. 北京:电子工业出版社,2001.

[4] Eckel B. Java编程思想(英文版?第三版)[M]. 北京:机械

工业出版社,2004.

10

本文来源:https://www.bwwdw.com/article/ct5w.html

Top