`

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;
        }
        ......
     }
转自:http://jstudiocn.blog.sohu.com/68717063.html

分享到:
评论

相关推荐

    利用网络远程控制实习报告总结报告模板.doc

    远程控制技术随着络协议的演进不断进步,早期主要使用NetBEUI、NetBIOS、IPX/SPX、TCP/IP等协议,而现在许多软件支持通过Web页面使用Java技术,实现跨平台的远程控制。此外,远程控制还扩展到了通过串口、并口、红外...

    基于安卓的蓝牙远程控制PC

    【基于安卓的蓝牙远程控制PC】技术详解 随着科技的进步,智能设备的远程控制成为了一种趋势。本文将深入探讨如何使用安卓智能手机通过蓝牙技术来远程控制个人电脑(PC),从而实现更便捷的交互方式。 1. **蓝牙...

    java远程屏幕监控系统(精华)

    2. 远程控制:用户可以通过控制面板模拟鼠标和键盘操作,这些指令被编码并通过Socket发送到远程计算机,由其解码并执行相应的操作,从而实现远程控制。 3. 文件传输:系统支持文件的上传和下载,便于管理员在远程...

    android手机控制电脑 gmote

    《Android手机控制电脑:Gmote的使用详解》 在当今科技日新月异的时代,远程控制技术已经不再是PC的专属。随着智能手机的发展,我们可以通过各种应用实现移动设备对电脑的远程操作。其中,Gmote就是这样一款强大的...

    基于Java的远程视频会议系统(系统+论文)

    【Java远程视频会议系统详解】 Java作为一种跨平台的编程语言,因其开源、高效和丰富的类库,成为构建复杂网络应用的首选。在远程视频会议系统领域,Java的强大功能得到了充分体现。本系统利用Java的技术特性,实现...

    毕业设计-android手机控制软件.doc

    该软件的主要功能是实现手机与电脑之间的远程控制,包括关机、唤醒、PPT 播放等功能。此外,该软件还实现了手机与其他 Android 设备之间的即时通信和文件传输,以及聊天室功能。 主要内容 1. 了解现在手机控制新...

    BluetoothRemoteControl

    2. **软件客户端与服务器端**:在电脑上,需要安装支持蓝牙远程控制的服务器端软件,如Java Client。该软件接收并处理来自手机的指令。而在手机端,也需要下载相应的控制应用,如“BluetoothRemoteControl”,作为...

    LiSheDaChuan-RemoteDesktop-Client-master_JavaSwing_RemoteDesktop

    《基于JavaSwing的远程桌面协助软件开发详解》 在当今信息技术高速发展的时代,远程桌面技术已经成为日常工作中不可或缺的一部分。本文将深入探讨一个名为“LiSheDaChuan-RemoteDesktop-Client-master_JavaSwing_...

    mpcremcon:用于 MPC 远程控制的 Android 应用程序

    为了进一步提升用户体验,开发人员推出了mpcremcon,这是一款专为MPC设计的Android应用程序,允许用户远程控制MPC,从而实现移动设备与电脑之间的无缝交互。本文将深入探讨mpcremcon的原理、功能以及如何使用。 ...

    Android手机控制软件毕业设计.doc

    Android 手机控制软件毕业设计 ...使用时客户端程序向被控端电脑中的服务器端程序发出信号,建立一个 socket,然后通过 socket,使用各种控制功能发送远程控制命令,实现手机和电脑之间的交互控制。

    java连连看小游戏

    **Java连连看小游戏详解** Java连连看是一款基于Java编程语言开发的小型桌面游戏,它以其简单易上手、趣味性强的特点深受玩家喜爱。本项目旨在提供一个基础版本的连连看游戏,供学习者研究和扩展,以提升Java编程...

    Bluetooth_for_Java

    《蓝牙技术在Java平台的应用详解》 蓝牙技术是一种短距离无线通信技术,它允许设备间进行数据交换,尤其适用于个人电子设备之间的连接,如手机、电脑、耳机等。Java作为跨平台的编程语言,提供了对蓝牙的支持,使得...

    RemoteScreen

    它允许用户通过网络,以图形化的方式查看并操作远程电脑,实现了远程控制的目标。 在"RemoteScreen"中,核心组件可能包括服务器端和客户端两部分。服务器端负责接收客户端的屏幕图像数据,并显示在控制端;而客户端...

    DLNA技术详解

    - **远程控制**:通过控制点可以远程操作媒体服务器和媒体渲染器,如播放、暂停、快进等。 - **多房间播放**:允许同时在多个房间的设备上播放相同的媒体内容。 - **格式转换**:DLNA设备能够自动将不同格式的媒体...

    让你的安卓手机 模拟鼠标 无线 控制电脑

    【标题解析】 标题“让你的安卓手机模拟鼠标 无线 控制...综上所述,这个技术涉及到安卓应用开发、无线通信技术、设备驱动程序、人机交互设计等多个IT领域的知识,为用户提供了一种创新且便捷的远程控制电脑的方式。

    Android应用开发详解

    Web服务如RESTful API,允许应用与服务器端进行数据交换,实现动态内容展示和远程操作。 ### 六、多媒体处理 Android应用可以轻松处理音频、视频等多媒体内容,利用MediaPlayer、MediaRecorder等类,可以播放、...

    java设计模式解释

    ### Java设计模式详解 在软件开发领域,设计模式是一种被广泛使用的解决常见问题的方法论,它们可以帮助开发者写出更高效、可维护的代码。本文将基于一份由“牛人”整理的设计模式材料,对其进行详细的解读与扩展,...

    androidscreencast-0.0.12s-executable.jar

    "androidscreencast-0.0.12s-executable.jar"是一个基于Java的命令行工具,它的主要功能是将Android设备的屏幕画面实时传输到电脑上,并允许用户通过电脑来远程控制设备。它的命名规则遵循了Java可执行jar包的格式,...

Global site tag (gtag.js) - Google Analytics