Java JDK1.4 的Robot对象,该对象可以完成屏幕图像截取操作,控制鼠标,键盘,如此便可以轻而易举地实现远程服务器的控制。本文向大家介绍如何用Java Robot对象实现远程服务器的控制,并给出了相应的Java源代码。
实现原理:

(1)被控端通过Robot截取桌面图像通过socket通信传给主控端。
   (2)主控端显示被控端桌面,并且把基于被控端图像上的键盘,鼠标事件通过socket通信传给被控端。
    (3)被控端响应主控端的鼠标键盘事件。
实现详解:

(一)主控端和被控端通过UDP进行指令交互
         /*-主控端向被控端发送指令-*/
        String command = ...;   //指令
        InetAddress inet = ...; //被控端地址
        int port = ...;         //端口
        byte sp[] = command.getBytes();
         DatagramPacket packet = new DatagramPacket(sp,sp.length(),inet,port);
        DatagramSocket sd = new DatagramSocket();
        sd.send(packet);
        /*-被控端接收指令-*/
        DatagramSocket stockUDP = ...;
        DatagramPacket packet = ...;
         stockUDP.receive(packet);
         String message=new String(packet.getData(),0,packet.getLength()); //得到指令  
        本程序中用到的指令
        public static final String Command_Connection = "connection" ;      //建立连接
        public static final String Command_Disconnection = "disconnection";//断开连接
        public static final String Command_Screen = "screen";               //显示被控端屏幕
        public static final String Command_Control="control";              //建立控制套接
   (二)被控端向主控端传递图像
        /*-被控端获取屏幕图像-*/
        Rectangle rect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());//全屏区域
        Robot robot=new Robot();
        BufferedImage image = robot.createScreenCapture(rect);
        /*-开启图像传送线程-*/
        Socket socket = ...;
        OutputStream out = socket.getOutputStream();
        BufferedImage image ;
        JPEGImageEncoder encoder =JPEGCodec.createJPEGEncoder(out);
        ......
        public void run(){     
            while(true){
               image = ...; //获取屏幕图像
                encoder.encode(image); //发送图像给主控端
                Thread.sleep(Environment.IMAGE_GETTIME); //图像采集时间间隔
            }
        }
        /*-主控端图像接收线程-*/
        JPEGImageDecoder de = JPEGCodec.createJPEGDecoder(socket.getInputStream());
        BufferedImage image = null ;
        ......
        public void run(){
            while(true){
                image = de.decodeAsBufferedImage();
                if (image != null) {
                     /*显示图像*/
                }
            }
        }
   (三)图像显示,鼠标,键盘监听
        /*-图像显示-*/
        public class ControlledScreenPanel extends JPanel implements MouseMotionListener,
                                          MouseListener,MouseWheelListener ,KeyListener{
            private BufferedImage image ;
            public void setBufferedImage(BufferedImage bi) {   //更新图像
                image = bi;
                Dimension d = new Dimension(image .getWidth(this),image .getHeight(this));
                setPreferredSize(d);
                revalidate();
                repaint();
            }
            public void paintComponent(Graphics g) {   //绘制图像
                super.paintComponent(g);
                Dimension d = getSize();
                g.setColor(getBackground());
               g.fillRect(0, 0, d.width, d.height);
               if (image != null) {
                   g.drawImage(image , 0, 0, this);
                }
            }
        }
        /*-鼠标,键盘监听-*/
        private MainControlSocket control ; //发送鼠标,键盘事件到被控端
        public void mouseDragged(MouseEvent e) {
            control.sendControlledAction(e);
        }
        public void mouseMoved(MouseEvent e) {
            control.sendControlledAction(e);
        }
        //--------------------------------------------------------------------------
        public void mouseClicked(MouseEvent e) { 
            requestFocus();//单击获得焦点
        }
        public void mousePressed(MouseEvent e) { //鼠标按下
            control.sendControlledAction(e);
        }
        public void mouseReleased(MouseEvent e) { //鼠标释放
            control.sendControlledAction(e);
        }
        public void mouseEntered(MouseEvent e) {}
        public void mouseExited(MouseEvent e) {}
        //--------------------------------------------------------------------------
        public void mouseWheelMoved (MouseWheelEvent e){ //滑轮滚动
             control.sendControlledAction(e);
        }
        //--------------------------------------------------------------------------
        public void keyTyped(KeyEvent e) {}
        public void keyPressed(KeyEvent e) { //键盘按下
            control.sendControlledAction(e);
        }
        public void keyReleased(KeyEvent e) { //键盘释放
            control.sendControlledAction(e);
       }
        /*-发送鼠标,键盘事件到被控端-*/
       class MainControlSocket {
            private Socket socket = null;
            private ObjectOutputStream out = null; //事件对象发送封装
            ......
            public void sendControlledAction(InputEvent event) {
                try {
                 out.writeObject(event);
               }
               catch (IOException e) {
                  e.printStackTrace();
               }
            }
            ......
       }
   (三)被控端接收,响应键盘鼠标事件
        private Socket socket = ...;
        private ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
        private Robot action = new Robot();

public void run(){
            ......
            while(true){
                Object obj = in.readObject();       //获得鼠标键盘事件
                if (obj != null) {
                    handleEvent( (InputEvent) obj); //处理鼠标键盘事件

}
            }
            ......
        }      
        private void handleEvent(InputEvent event){
            MouseEvent mevent = null ; //鼠标事件
            MouseWheelEvent mwevent = null ;//鼠标滚动事件
            KeyEvent kevent = null ; //键盘事件
            int mousebuttonmask = -100; //鼠标按键
            switch (event.getID()){
                case MouseEvent.MOUSE_MOVED :                       //鼠标移动
                    mevent = ( MouseEvent )event ;
                    action.mouseMove( mevent.getX() , mevent.getY() );
                    break ;
                case MouseEvent.MOUSE_PRESSED :                      //鼠标键按下
                    mevent = ( MouseEvent ) event;
                    action.mouseMove( mevent.getX() , mevent.getY() );
                    mousebuttonmask = getMouseClick( mevent.getButton() );
                    if(mousebuttonmask != -100)
                        action.mousePress(mousebuttonmask);
                    break;
                 case MouseEvent.MOUSE_RELEASED :              //鼠标键松开
                    mevent = ( MouseEvent ) event;
                    action.mouseMove( mevent.getX() , mevent.getY() );
                    mousebuttonmask = getMouseClick( mevent.getButton() );//取得鼠标按键
                    if(mousebuttonmask != -100)
                        action.mouseRelease( mousebuttonmask );
                    break ;
                case MouseEvent.MOUSE_WHEEL :                  //鼠标滚动
                    mwevent = ( MouseWheelEvent ) event ;
                    action.mouseWheel(mwevent.getWheelRotation());
                    break ;
                 case MouseEvent.MOUSE_DRAGGED :                      //鼠标拖拽
                    mevent = ( MouseEvent ) event ;
                    action.mouseMove( mevent.getX(), mevent.getY() );
                    break ;
                 case KeyEvent.KEY_PRESSED :                     //按键
                    kevent = ( KeyEvent ) event;
                    action.keyPress( kevent.getKeyCode() );
                    break ;
                 case KeyEvent.KEY_RELEASED :                    //松键
                    kevent= ( KeyEvent ) event ;
                    action.keyRelease( kevent.getKeyCode() );
                    break ;
                default: break ;
            }
        }
        private int getMouseClick(int button) {    //取得鼠标按键
            if (button == MouseEvent.BUTTON1) //左键 ,中间键为BUTTON2
                return InputEvent.BUTTON1_MASK;
            if (button == MouseEvent.BUTTON3) //右键
                return InputEvent.BUTTON3_MASK;
            return -100;
        }
        ......
     }

http://blog.csdn.net/songylwq/article/details/7715157

java实现电脑远程控制完整源代码(转)的更多相关文章

  1. GitHub开源:升讯威微信营销系统(第三方微信平台)完整源代码

    GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction 升讯威微信营销系统开发实践系列升讯威微信营销系统开发实践:(1)功能设计与架构设 ...

  2. java nio 写一个完整的http服务器 支持文件上传 chunk传输 gzip 压缩 使用过程 和servlet差不多

    java nio 写一个完整的http服务器  支持文件上传   chunk传输    gzip 压缩      也仿照着 netty处理了NIO的空轮询BUG        本项目并不复杂 代码不多 ...

  3. Java 网络爬虫获取网页源代码原理及实现

    Java 网络爬虫获取网页源代码原理及实现 1.网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL ...

  4. Unity3D手游-横版ACT游戏完整源代码下载

    说明: 这不是武林.这不是江湖,没有道不完的恩怨,没有斩不断的情仇,更没有理不清的烦恼,这是剑的世界,一代剑魁闯入未知世界,将会为这个世界展开什么样的蓝图.让你来创造它的未来,剑魁道天下,一剑斗烛龙! ...

  5. Java中arraylist和linkedlist源代码分析与性能比較

    Java中arraylist和linkedlist源代码分析与性能比較 1,简单介绍 在java开发中比較经常使用的数据结构是arraylist和linkedlist,本文主要从源代码角度分析arra ...

  6. cocos2d-x《农场模拟经营养成》游戏完整源代码

    cocos2d-x农场模拟经营养成游戏完整源代码,cocos2d-x引擎开发,使用JSON交互,支持IOS与 Android,解压后1016MB. 非常强大的游戏源代码         完整游戏源代码 ...

  7. Java学习路线(完整详细版)

    Java学习路线(完整详细版) https://jingyan.baidu.com/article/c1a3101e110864de656deb83.html

  8. Eclipse、MinGW、JNI编写C++生成dll, Java端调用的完整示例(附java.lang.UnsatisfiedLinkError解决方法)

     Eclipse.MinGW.JNI编写C++生成dll, Java端调用的完整示例(附java.lang.UnsatisfiedLinkError解决方法) 问题背景:之前的JNI编程都是基于And ...

  9. Java工程师 基础+实战 完整路线图(详解版)

    Java工程师 基础+实战 完整路线图(详解版)   Java 基础 Java 是一门纯粹的面向对象的编程语言,所以除了基础语法之外,必须得弄懂它的 oop 特性:封装.继承.多态.此外还有泛型.反射 ...

随机推荐

  1. QVector 和vector的比较

    QVector和vector的比较: Qvector默认使用隐式共享,可以用setSharable改变其隐式共享.使用non-const操作和函数将引起深拷贝.at()比operator[](),快, ...

  2. pv ticketlock解决虚拟环境下的spinlock问题

    最近看邮件,有注意到pv ticketlock相关的消息,貌似jeremy 几年前的东东,终于将要被收录到linux 3.12里面. 先说下pv ticketlock这东西,http://blog.x ...

  3. SQL Server 链接数据库 error:40

    链接到远程服务器的话,经常犯这个错误,所以做个笔记,省的每次去百度. 1.如果使用的是 local 链接,只需要启动服务就可以了(如下图) 2.如果是远程链接的话,那么是需要启动TCP协议的,步骤如下

  4. 练习笔记:net,JqueryUI实现自动补全功能

    1.首先建立个空的Web项目 2.将下载好的JqueryUI文件保存到JS文件加下 3.引入JS文件 <link href="JS/css/ui-lightness/jquery-ui ...

  5. Object-c中@private、@protected、@public解析

    Objective-C中,类的实例化变量的范围有@private.@protected.@public.他们代表的意思和C++中相同,只是前面添加了一个@符号.下面介绍一下他们代表的范围: 指令 意思 ...

  6. Mysql 正则表达式 判断字段值不包含数字

    SELECT * FROM (select replace(FlightId_IaTa,LEFT(FlightId_IaTa,2),'') as aa,FlightId_IaTa,FlightIdfr ...

  7. IIS网站发布容易出现的几个问题

    1. 更新版本或者重新安装.net Framework: 2. 更改配置文件节点: 3. 访问权限问题的更改:

  8. cocos2d-x中的CCScrollView滑动体验不佳

    在最近的项目中,使用了Cocos2d-x (2.2.0版本)提供的CCScrollView来拖动一个比较大的画面,但是发现滑动体验非常不佳, 手指离开屏幕后,滑动没有惯性,一个不算太大的画面,要滑动好 ...

  9. php基础知识(有代码有注释)

    回顾 数组: 数据的组合 数组定义: 三种方式(常用array()) 数组访问: 下标 数组分类: 关联数组, 索引数组和混合数组 数组循环遍历: foreach遍历(foreach原理) 二维数组: ...

  10. 64位linux下安装oracle10 64位 遇到 :ins_ctx.mk ;ins_emdb.mk

    http://blog.csdn.net/bamuta/article/details/10523835 http://www.cnblogs.com/kerrycode/p/3519446.html ...