`
wezly
  • 浏览: 485332 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

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


    运行图示:


       

  • 大小: 17.1 KB
  • 大小: 14.1 KB
  • 大小: 63.4 KB
分享到:
评论
1 楼 Cross_Lee 2012-04-13  
远程演示,怎么实现截屏时包含鼠标。
Robot的截屏方法截的没有鼠标

相关推荐

    Java实现远程控制技术(附完整源代码)

    本文将深入探讨如何使用Java实现远程控制功能,并结合提供的源代码进行解析。 首先,Java作为一种跨平台的编程语言,拥有丰富的库和API,能够方便地实现网络通信和多线程操作,这为构建远程控制应用提供了坚实的...

    java实现远程控制

    Java实现远程控制是一种基于网络的计算机技术,它允许用户通过Internet或其他网络连接远程访问和操作另一台计算机。在Java中,远程控制主要依赖于Java的网络编程能力,包括Socket编程和RMI(Remote Method ...

    利用Java实现远程控制

    ### 利用Java实现远程控制的关键知识点 #### 1. 远程控制的原理与应用场景 远程控制技术允许用户通过网络远程操作另一台计算机,如同直接在该计算机面前操作一样。这种技术在远程设备维护、监控与故障诊断等方面...

    Java实现远程控制技术完整源代码分享

    Java实现远程控制技术的核心在于利用Java的网络编程和图形用户界面(GUI)功能。通过Java的`java.net`包中的`Socket`类和`ServerSocket`类,可以建立起客户端与服务器端之间的通信链路,实现数据的双向传输。而`java...

    远程控制java实现

    下面我们将深入探讨这些技术及其在实现远程控制中的应用。 首先,RMI 是 Java 平台提供的一种标准机制,它允许对象在不同的 JVM(Java 虚拟机)之间进行通信。通过 RMI,一台计算机上的客户端可以调用另一台计算机...

    利用Java实现远程控制显微镜自动聚焦.pdf

    利用 Java 实现远程控制显微镜自动聚焦技术 本文介绍了一种基于 Java 的网络控制技术,用于实现显微镜的自动聚焦。该技术采用 Java Media Framework (JMF) 技术和 C/S 模式来实现网络控制,通过 Socket 通信和基于 ...

    java实现的远程控制 源码

    【标题】:“java实现的远程控制 源码”揭示了这个项目是使用Java编程语言构建的一个远程控制程序。远程控制通常涉及到一个客户端和服务器端的通信,允许用户通过网络对另一台计算机进行操作。在这个特定的案例中,...

    java程序实现远程控制

    本文将详细介绍如何通过Java实现远程控制功能,包括屏幕图像截取、鼠标与键盘控制等核心功能。 ### 一、Java远程控制的基础原理 远程控制的核心在于两台计算机之间能够互相通信并共享数据。在Java中,可以通过`...

    java远程控制屏幕

    以下将详细阐述如何使用Java实现远程控制屏幕以及实现互相通信的关键知识点。 1. **RMI(Remote Method Invocation)远程方法调用**: Java的RMI是实现远程对象交互的基础,它允许一个Java对象调用在网络另一端的...

    Java实现的远程控制

    Java 远程控制 SocketJava 远程控制 SocketJava 远程控制 SocketJava 远程控制 SocketJava 远程控制 SocketJava 远程控制 SocketJava 远程控制 Socket

    Java远程控制简单实现

    这篇名为“Java远程控制简单实现”的博客文章可能探讨了如何利用Java技术实现远程控制系统。远程控制通常涉及通过网络对远程计算机进行操作,这在系统管理、自动化任务执行以及分布式系统通信中非常常见。 首先,...

    Java实现远程桌面连接

    Java实现远程桌面连接的properjavardp源码工程,可直接运行。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...

    Java实现远程桌面(参赛作品)

    在这个项目中,"Java实现远程桌面"是一个使用纯Java编程语言编写的远程桌面解决方案,它使得用户能够在一台计算机上操控另一台计算机,无论它们之间的距离有多远。下面我们将深入探讨这个项目的相关知识点: 1. **...

    java项目实例_远程控制Java源码

    本项目实例“java项目实例_远程控制Java源码”聚焦于利用Java实现远程控制功能,这是一个实用且常见的技术需求,特别是在分布式系统和网络管理中。 远程控制通常涉及到以下几个关键技术点: 1. **RMI (Remote ...

    java实现远程桌面程序socket版

    其他IDE稍做修改就行,源码不依赖其他JAR包,所以容量很小,服务端主窗口为表格,可以打开预览窗口(屏幕墙),预览在线客户端画面,可以控制在线的电脑,另外包含功能:开机(客户端处理关机状态且打开远程唤醒的...

    java实现的远程控制程序

    2. **Socket编程**:除了RMI,Java的Socket编程也是实现远程控制的常见方式。通过创建服务器和客户端Socket,两个应用程序之间可以建立连接并交换数据。服务器端接收客户端的请求,执行相应操作,然后将结果返回给...

    java 远程控制程序

    Java提供了一种跨平台的方式来实现远程控制,利用其内置的Java Remote Method Invocation (Java RMI) 技术。RMI允许Java对象在不同的Java虚拟机(JVM)之间进行通信,就像是在同一台机器上运行一样。 Java RMI的工作...

    java版远程控制的实例demo

    Java远程控制技术是一种在计算机网络中,通过编程实现一台设备(客户端)对另一台设备(服务器端)进行操作的方法。这种技术广泛应用于系统管理、自动化运维、分布式系统监控等领域。在这个"java版远程控制的实例...

Global site tag (gtag.js) - Google Analytics