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-
中国自控网邮局订阅号:82-946360元/年
-137-
网络与通信
中文核心期刊《微计算机信息》管控一体化)2006年第22卷第3-3期(
ager(界面管理类)、Socket(套接字类)、ServerSocket(服务
器套接字类)和InetAddress(Internet地址类)。
publicvoidmouseWheelMoved(MouseWheelEvente){//向被控端发送MOUSE_WHEELMOVED,e.getX(),e.getY(),e.getUnitsToScroll()}});
对于键盘指令,可以让窗口把自己作为听众加入来获得,具体如下:
Robot类的重要方法有createScreenCapture(Rect-anglescreenRect)、mousePress(intbuttons)、mouseRe-
和keyRelease
lease(intbuttons)、mouseMove(intx,inty)、mouseWheelkeyPress(intkeycode)(intwheelAmt)、
按(intkeycode),功能分别是捕获屏幕图象、下鼠标键、开鼠标键、动鼠标键、转鼠标滚动轮、下松移旋按一特定键和松开一特定键。Toolkit类的重要方法有
Toolkit.getDefaultToolkit(newAWTEventListener(){
().addAWTEventListener
getDefaultToolkit().getScreenSize()和getDefaultToolkit().addAWTEventListener(),功能分别是得到屏幕的大小
和把窗口事件处理委托给某个听众。
publicvoideventDispatched(AWTEventevent){KeyEvente=(KeyEvent)event;if(e.getID()==KeyEvent.KEY_PRESSED){//向被控端发送KEY_PRESSED,e.getKey-Code(),e.getKeyChar(),e.getKeyLocation()}elseif(e.getID()==KeyEvent.KEY_RELEASED){//向被控端发送KEY_RELEASED,e.getKey-Code(),e.getKeyChar(),e.getKeyLocation()}}},AWTEvent.KEY_EVENT_MASK);
被控端程序接收来自控制端的鼠标和键盘操作指令后,可以根据具体指令执行Robot类的相应方法即可实现操作模拟(参见2.2)。需要说明的是,控制端程序需要根据被控端程序发送的屏幕图象的大小来设置显示被控端屏幕图象的窗口组件的大小,这样,被控端程序收到控制端程序发送的鼠标坐标就可以准确定位本地鼠标位置。
2.3程序设计实现要点2.3.1鼠标和键盘事件的获取及操作模拟
客户端程序需要不断地接收服务器端程序发送的屏幕图象,然后在客户端窗口中显示,并捕捉客户端在屏幕图象显示窗口中用户发出的鼠标和键盘指令。对于鼠标指令,可以通过让窗口组件对象把自己作为鼠标和鼠标运动听众加入来获得,具体如下:
技术创新
//加入鼠标听众this.addMouseListener(newMouseListener(){publicvoidmousePressed(MouseEvente){//向被控端发送MOUSE_PRESSED,e.getX(),e.getY(),e.getButton()}publicvoidmouseReleased(MouseEvente){//向被控端发送MOUSE_RELEASED,e.getX(),e.getY(),e.getButton()}});//加入鼠标运动听众this.addMouseMotionListener(newMouseMotionLis-tener(){publicvoidmouseDragged(MouseEvente){//向被控端发送MOUSE_DRAGGED,e.getX(),e.getY(),e.getButton()}publicvoidmouseMoved(MouseEvente){//向被控端发送MOUSE_MOVED,e.getX(),e.getY(),e.getButton()}});this.addMouseWheelListener(newMouseWheelLis-tener(){
-138-
2.3.2屏幕图象的压缩/解压缩
屏幕图象是以位图格式获得的,直接传输会造成比较大的延时,为了提高远程控制的实时性,需要对获取的屏幕图象数据进行压缩后再传输,另外,不应该使用文件的形式进行屏幕图象传输,而是应该直接传输内存数据,这样也会明显地减小延时。屏幕图象的压缩方法如下: