java实现远程控制

来源:互联网 发布:阿里云服务器升级内存 编辑:程序博客网 时间:2024/05/16 05:57

java实现远程控制

今天我第一次用markdow写博客,虽然感觉有点别扭,但是好歹也要尝试一下新的事物。
今天我做java的远程操纵程序,类似QQ的远程控制。
但是只是做了鼠标和键盘的,而且因为是一个人做,所以测试相当的不方便,程序运行后鼠标进入了无限的返回,到星期六再和队友测试一下。
还有就是想做屏幕同步功能,但是遇到了BufferedImage类没序列化的难题,本来是想创建一个新的MyBufferedImage类继承BufferedImage类然后再实现序列化接口Serializable,后来我发现我想得太简单了,继承BufferedImage类需要重写里面的方法。
再加上现在时间也比较晚了,所以就没有做下去,明天再解决问题吧。
下面是我的java远程控制实现(只有鼠标键盘控制,没有界面同步)代码:
客户端有两个类,一个是单例客户端的封装类,还有一个是界面类:
界面类:

package control;import java.awt.Dimension;import java.awt.Graphics;import java.awt.Toolkit;import java.awt.event.InputEvent;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.image.BufferedImage;import java.io.ObjectInputStream;import javax.swing.JFrame;import javax.swing.JPanel;public class ControlClient extends JFrame{    public JPanel jp;    public static void main(String[] args) {        ControlClient cc = new ControlClient();        cc.remoteConnect();        cc.initFrame();    }    public void initFrame(){        setTitle("");        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();        setSize(dim);        setDefaultCloseOperation(3);        setLocationRelativeTo(null);        setVisible(true);//      ClientRun(ClientSingle.getClientSingle().getObjectInputStream(),this);        this.addMouseListener(ma);        this.addKeyListener(ka);        this.addMouseMotionListener(ma);        this.addMouseWheelListener(ma);    }    MouseAdapter ma = new MouseAdapter(){        public void mousePressed(MouseEvent e) {            SendEvent(e);        }        public void mouseClicked(MouseEvent e) {            SendEvent(e);        }        public void mouseReleased(MouseEvent e) {            SendEvent(e);        }        public void mouseMoved(MouseEvent e) {            SendEvent(e);        }    };    KeyAdapter ka = new KeyAdapter(){        public void keyPressed(KeyEvent e) {            SendEvent(e);        }        public void keyReleased(KeyEvent e) {            SendEvent(e);        }    };    private void SendEvent(InputEvent e){        try {            ClientSingle.getClientSingle().getObjectOutputStream().writeObject(e);            ClientSingle.getClientSingle().getObjectOutputStream().flush();        } catch (Exception e1) {            e1.printStackTrace();        }    }    private void remoteConnect(){//获取连接        ClientSingle.getClientSingle().getConnect();        System.out.println("连接服务器成功......");    }    private void ClientRun(ObjectInputStream ois,JFrame jf){        new Thread(){            public void run() {                while(true){                    try {                        Object obj = ois.readObject();                        BufferedImage screenshot = (BufferedImage) obj;                        Graphics g = jf.getGraphics();                        g.drawImage(screenshot, 0, 0, null);                    } catch (Exception e) {                        e.printStackTrace();                    }                }            };        }.start();    }}

下面的是客户端对象的单例实现:

package control;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.net.Socket;public class ClientSingle {//客户端单例实现    private ClientSingle(){//构造函数私有    }    private static ClientSingle cs ;//客户端对象私有    public static synchronized ClientSingle getClientSingle(){        if( cs == null ){            cs = new ClientSingle();        }        return cs;    }    private Socket client;    private ObjectOutputStream oos;    private ObjectInputStream ois;    public ObjectOutputStream getObjectOutputStream(){        return oos;    }    public ObjectInputStream getObjectInputStream(){        return ois;    }    public void getConnect(){        if( client == null ){            try {                client = new Socket("localhost",9090);                oos = new ObjectOutputStream(client.getOutputStream());                ois = new ObjectInputStream(client.getInputStream());            } catch (Exception e) {                e.printStackTrace();            }         }    }    public void closeConnect(){        try {            ois.close();            oos.close();            client.close();            client = null;        } catch (Exception e) {            e.printStackTrace();        }    }}

客户端类:

package control;import java.awt.AWTException;import java.awt.Dimension;import java.awt.Rectangle;import java.awt.Robot;import java.awt.Toolkit;import java.awt.event.InputEvent;import java.awt.event.KeyEvent;import java.awt.event.MouseEvent;import java.awt.image.BufferedImage;import java.io.File;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;import java.net.ServerSocket;import java.net.Socket;import javax.imageio.ImageIO;public class ByControlServer {    private Robot robot;    {        try {            robot = new Robot();        } catch (AWTException e) {            e.printStackTrace();        }    }    public static void main(String[] args) {        ByControlServer bcs = new ByControlServer();        bcs.initServer();    }    public void initServer(){        try {            ServerSocket ss = new ServerSocket(9090);            Socket socket = ss.accept();            System.out.println("有客户端连接上服务器......");            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());            while(true){                Object obj = ois.readObject();                if( obj instanceof MouseEvent ){                    MouseEvent me = (MouseEvent)obj;                    int id = me.getID();                    if( id == MouseEvent.MOUSE_PRESSED ){                        int ButtonNum = me.getButton();                        if( ButtonNum == MouseEvent.BUTTON1 ){                            robot.mousePress(InputEvent.BUTTON1_MASK);                        }else if( ButtonNum == MouseEvent.BUTTON2 ){                            robot.mousePress(InputEvent.BUTTON2_MASK);                        }else if( ButtonNum == MouseEvent.BUTTON3 ){                            robot.mousePress(InputEvent.BUTTON3_MASK);                        }                    }else if( id == MouseEvent.MOUSE_RELEASED || id == MouseEvent.MOUSE_CLICKED ){                        int buttonNum = me.getButton();                        if( buttonNum == MouseEvent.BUTTON1 ){                            robot.mouseRelease(InputEvent.BUTTON1_MASK);                        }else if( buttonNum == MouseEvent.BUTTON2 ){                            robot.mouseRelease(InputEvent.BUTTON2_MASK);                        }else if( buttonNum == MouseEvent.BUTTON3 ){                            robot.mouseRelease(InputEvent.BUTTON3_MASK);                        }                    }else if( id == MouseEvent.MOUSE_MOVED || id == MouseEvent.MOUSE_DRAGGED ){                        robot.mouseMove(me.getX(), me.getY());                    }                }else if( obj instanceof KeyEvent ){                    KeyEvent ke = (KeyEvent) obj;                    int id = ke.getID();                    if( id == KeyEvent.KEY_PRESSED ){                        robot.keyPress(ke.getKeyCode());                    }else if( id == KeyEvent.KEY_RELEASED ){                        robot.keyRelease(ke.getKeyCode());                    }                }//              getImage(oos);            }        } catch (Exception e) {            e.printStackTrace();        }    }    public void getImage(ObjectOutputStream oos){        try{            Dimension d = Toolkit.getDefaultToolkit().getScreenSize();            BufferedImage screenshot = (new Robot()).createScreenCapture(new Rectangle(0,0,(int)d.getWidth(),(int)d.getHeight()));            String name = "C:\\Users\\asus\\Desktop\\jietu.png";            File f = new File(name);            ImageIO.write(screenshot, "png", f);            oos.writeObject(screenshot);            oos.flush();        }catch(Exception e){        }    }}

远程控制建立后,就进入鼠标的无限返回,按下alt键后出现序列化异常
远程控制建立后,就进入鼠标的无限返回,按下alt键后出现序列化异常
客户端只能够看到一边的窗口
客户端只能够看到一边的窗口
屏幕截图已经实现,但是在发送至客户端的时候出现序列化异常,BufferedImage没办法序列化
屏幕截图已经实现,但是在发送至客户端的时候出现序列化异常,BufferedImage没办法序列化**

2 0