java实现电脑远程控制完整源代码

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;
        }
        ......
     }

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
基于JAVA CS远程监控系统软件的实现(源代码+WORD论文文档论文) 基于JAVA C/S远程监控系统软件的实现 摘 要 近年来,网络技术的不断发展,为远程监控技术的发展创造了条件。远程监控系统软件越来越受到人们的重视,其实用性也毋庸质疑。基于JAVA C/S远程监控系统软件突破了空间的限制,使用者不用亲临,在自己的电脑面前就能轻松的实现对被监控端机器的监控。本系统采用Java网络编程和Java图形编程实现。笔者在开发过程中将网络技术与远程监控理论基础相结合,实现了以下功能:能连续获得被监控端机器屏幕变化;实现被监控端硬盘文件的上传、下载;实现对鼠标、键盘的模拟;实现远程机器上执行任意DOS命令;远程关机、远程重启计算机,方便了用户监视和操作被监控端机器。本系统从系统需求分析、概要设计、详细设计到具体的编码实现和后期的代码优化、功能测试都严格遵循了软件工程的思想。 关键词:远程监控;Java Robot;屏幕截取;Java Socket 系统需求分析及理论基础 2.1 系统需求分析 2.1.1 系统功能需求 1.连续获得被控端机器屏幕变化。 2.实现被控端硬盘文件的上传、下载。 3.实现对鼠标、键盘的模拟。 4.实现在被控端机器上执行任意DOS命令。 5.远程关机、远程重启计算机。 2.1.2 其他需求 1.系统实用,界面操作简便。 2.被监控端自动隐藏运行。 被监控端将随电脑启动而自动运行,运行时默认无任何可见界面。 2.2 系统开发原理及关键技术 2.2.1 系统开发原理 本系统是利用类java.awt.robot中的屏幕截取和鼠标、键盘自动控制功能,然后加上网络传输功能来完成来完成截屏和远程控制的。 2.2.2 系统运行概述 1.启动被监控端,打开指定的UDP端口号。用于读取命令。 2.被监控端读取命令(命令格式为ordername:port)ordername为命令名字,port为主控端打开的TCP端口。 3.接到主控端连接后,被监控端就对当前用户的桌面采用屏幕截取,然后发送给主控端。依被监控端设计的不同,可以设定屏幕截取的时间间隔,时间间隔短一点就可以获得连续屏幕变化了。 4.主控端在画布上对鼠标、键盘事件进行监听,被监控端重演主控端上的事件 5.主控端和被监控端读取和发送数据,分别来实现文件上传和下载。 6.在被监控端实现DOS命令的执行。 2.2.3 系统的关键技术 系统使用的关键技术就是Java网络编程和Java图形编程。用Java网络编程实现主控端和被监控端的通讯(命令收发、数据传送),用Java图形编程完成主控端控制界面的编写。具体应用如下: 1.实现主控端(服务器)与被监控端(客户端)之间的通讯。 ——用Java Socket实现。 2.用Java采集事件,封装成消息,用于发送。 ——在主控端机器上采集事件(一般只不过是键盘和鼠标的事件),然后封装成消息类传输到被监控端。 3.在被监控端上重演主控端的动作事件。 ——在被监控端运行client端,接收消息,如果主控端有请求操作的消息,用Robot截下当前屏幕,传给主控端,主控端显示被监控端的屏幕,是一个位图;然后接收在这个位图上的鼠标事件和键盘事件,并把鼠标位置(位图上的坐标换算成对应的屏幕上的坐标)和键值送到被监控端上,在被监控端上重演同样的事件。 2.3 系统的开发平台 JDK1.5.0,Eclipse3.1,Windows XP Professional 2.3.1 Eclipse介绍 Eclipse是一种可扩展的开放源代码IDE。2001年11月,IBM公司捐出价值4,000万美元的源代码组建了Eclipse联盟,并由该联盟负责这种工具的后续开发。集成开发环境(IDE)经常将其应用范围限定在“开发、构建和调试”的周期之中。为了帮助集成开发环境 (IDE)克服目前的局限性,业界厂商合作创建了Eclipse平台。Eclipse允许在同一IDE中集成来自不同供应商的工具,并实现了工具之间的互操作性,从而显著改
实现电脑远程控制的方式有很多种,其中常见的方法是使用 Socket 编程实现远程控制。下面是一个简单的 Java 实现远程控制的示例代码: Server 端代码: ```java import java.io.*; import java.net.*; public class Server { public static void main(String[] args) { try { ServerSocket server = new ServerSocket(8888); System.out.println("等待客户端连接..."); Socket socket = server.accept(); System.out.println("客户端已连接:" + socket.getRemoteSocketAddress()); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); String inputLine; while ((inputLine = in.readLine()) != null) { System.out.println("收到客户端消息:" + inputLine); if (inputLine.equals("exit")) { break; } else { Runtime.getRuntime().exec(inputLine); out.println("命令已执行"); } } in.close(); out.close(); socket.close(); server.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` Client 端代码: ```java import java.io.*; import java.net.*; public class Client { public static void main(String[] args) { try { Socket socket = new Socket("localhost", 8888); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); String userInput; while ((userInput = stdIn.readLine()) != null) { out.println(userInput); if (userInput.equals("exit")) { break; } else { System.out.println("服务器回复:" + in.readLine()); } } in.close(); out.close(); stdIn.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 以上代码实现了一个简单的远程控制功能,可以通过客户端向服务器发送命令实现远程控制。需要注意的是,这个示例代码只是为了演示远程控制的原理,实际使用中还需要进行安全性考虑,避免被非法操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值