Java implémente la technologie de télécommande
Un mélange de java.net et java.awt.robot., Qui est livré avec Java, peut être utilisé pour réaliser la télécommande d'un autre ordinateur sur le réseau, y compris le contrôle du mouvement de la souris d'ordinateur distant et l'entrée du clavier, et l'obtention d'images de l'écran d'ordinateur distant en temps réel. Cet article utilisera un langage concis et une logique de superficiel à profond pour vous apprendre à maîtriser cette technique.
Tout d'abord, jetons un coup d'œil aux rendus:
Interface d'ordinateur distant:
Interface de l'ordinateur du terminal de contrôle:
Entrée du terminal de contrôle:
Entrée à distance:
Commençons par l'introduction détaillée des idées techniques de la télécommande.
Tout d'abord, les deux ordinateurs sont connectés via la prise de java.net.
Ouvrez d'abord un SERVERSOCKET à une extrémité, puis connectez-vous à l'autre extrémité avec une prise.
Côté serveur
Un Serversocket doit être configuré et les flux d'entrée et de sortie nécessaires sont initialisés:
public static void openServer () lève ioException, classNotFoundException {System.out.println ("ServerStart ......"); SERVERSOCKET Server = new SERVERSocket (7777); socket = server.accept (); System.out.println ("sur connexion ... / n" + socket); OIS = new ObjectInputStream (socket.getInputStream ()); Oos = new ObjectOutputStream (socket.getOutputStream ()); }Côté client <br /> La prise doit être utilisée pour se connecter au serveur et initialiser le flux d'entrée et de sortie:
public static void startConnection (String ip, int port) lève unknownhostException, ioException, awtexception {socket = new socket ("192.168.0.106", 7777); if (socket.isconned ()) {System.out.println ("socket connecté ..." + socket); } Oos = new ObjectOutputStream (socket.getOutputStream ()); OIS = new ObjectInputStream (socket.getInputStream ()); }De cette façon, les deux ordinateurs sont liés ensemble et les données peuvent être échangées via des flux (InputStream et OutputStream).
Ensuite, vous pouvez réfléchir aux informations que deux ordinateurs doivent échanger contre la télécommande? Tout d'abord, l'extrémité contrôlée doit fournir en continu l'image de l'écran à l'extrémité de contrôle (celle-ci sera implémentée à l'aide de Java.awt.Robot), puis la souris et le clavier effectuent la même opération en fonction de l'événement (inputevent) transmis par l'extrémité de contrôle (implémentée à l'aide du robot). Ensuite, l'extrémité de contrôle doit d'abord recevoir l'image transmise par l'extrémité contrôlée et la refléter sur un panneau (volet), puis surveiller les actions du clavier et de la souris sur la machine, puis la transmettre à l'hôte de l'extrémité contrôlée (nous pouvons le faire en définissant un auditeur sur le volet panneau)
Un problème rencontré ici est que les images utilisées pour la transmission ne peuvent pas être sérialisées, qu'elles utilisent l'image ou la tampon. Par conséquent, I / Osstream ne peut pas être utilisé pour la transmission. Par conséquent, afin de résoudre ce problème, nous devons encapsuler les données d'image dans une classe et implémente la classe d'image d'interface sérialisable comme suit:
Importer java.io.file; import java.io.fileInputStream; import java.io.filenotfoundException; import java.io.ioException; import java.io.serializable; le message public met en œuvre sérialisable {finale privée finale statique long SerialVersionuid = 1l; Nom de fichier de chaîne privée; // Nom de fichier privé long fileLength; // Longueur de fichier octet privé [] FileContent; // contenu de fichier Message public () {} message public (String filepath) lève ioException {file file = new File (filepath); this.fileLength = file.length (); this.filename = file.getName (); FileInputStream fis = new FileInputStream (filepath); octet [] octets = nouveau octet [(int) fileLelength]; Fis.read (octets, 0, (int) fileLelength); this.FileContent = octets; } public String getFileName () {return filename;} public void setFileName (String filename) {this.filename = filename;} public long getFileLength () {return fileLength; } public void setFileLength (long fileLengthreng) {this.filelength = fileLength;} public byte [] getFileContent () {return fileContent;} public void setFileContent (byte [] fileContent) {this.fileContent = fileContent;}}Cela permet à l'image de se propager par la sérialisation de ObjectInputStream et ObjectOutputStream
Après avoir compris les bases ci-dessus, nous devons d'abord terminer le paramètre d'interface de l'interface utilisateur, la réception d'image et la surveillance de l'action du clavier et de la souris du côté de contrôle:
Tout d'abord, configurez l'image de réception:
public static void reveivepic () lève classNotFoundException, ioException {message g = (message) ois.readObject (); FileoutputStream fos = new FileOutputStream ("d: // out //" + g.getFileName ()); Fos.write (g.getFileContent (), 0, (int) g.getFileLength ()); Fos.flush (); FileInputStream fis = new FileInputStream ("d: // out //" + g.getFileName ()); BufferedImage Bi = ImageIo.read (Fis); Iic = new ImageIcon (BI); Image img = iic.getImage (); Toolkit tk = toolkit.getDefaultToolkit (); Dimension d = tk.getScreenSize (); int w = d.width; int h = d.height; BufferedImage BI = redimensionner (IMG, 800 600); Image_Lab.seTICon (new ImageIcon (BI)); img_lab.repaint (); // perche à l'arrière-plan que j'ai dessiné avant} Resize de tampon statique statique privé (image img, int neww, int newh) {int w = img.getWidth (null); int h = img.getheight (null); BufferedImage dimg = new BufferedImage (Neww, newh, bufferedImage.type_int_bgr); Graphics2d g = dimg.creategraphics (); g.setRenderingHint (RenderingHints.key_interpolation, RenderingHint.value_interpolation_bilinear); G.DrawImage (img, 0, 0, neww, newh, 0, 0, w, h, null); g.dispose (); return dimg; }De cette façon, après avoir reçu la classe de messages de ObjectInputStream, l'image peut être réinitialisée à la taille du volet du panneau et affiché
L'étape suivante consiste à définir les propriétés et les auditeurs du panneau:
public static void showui () {// title de la console jframe jf = new JFrame ("console"); setListener (JF); // Taille de la console JF.SetSize (500, 400); // imag_lab est utilisé pour stocker l'image imag_lab = new JLabel (); jf.add (imag_lab); // setVisible (true); // Console top jf.setAlwayAntop (true); jf.setResiSable (true); jf.setDefaultCloseOperation (jframe.exit_on_close); }Auditeur:
public static void setListener (jframe frame) {// panners set écouteur frame.addkeyListener (new KeyAdapter () {public void keypressed (keyEvent e) {SendEventObject (e);} @Override public void keyreleda (keyEvent e) {SENDEVENTOBject (e);} @override public Void. frame.addmousewheelListener (new MouseWheelListERner () {public void muousewheelMoved (souriswheelEvent e) {SendEventObject (e);}}); frame.AddMousMotionListener (new MousMotionListener () {public void MouseDragged (Mouseevent e) {SenveventObject (e);} public void MouseMoved (MouseEvent e) {SenveveventObject (e);}}); frame.AddMouseListener (new MouseListener () {public void MouseClicked (MouseEvent E) {SenveveventObject (e);} public void muouseentered (Mouseevent e) {SenveveventObject (e);} public vide mouseexite {SendEventObject (E);} public void MouseLelent (MouseEvent e) {SendEventObject (E); } private static void SendEventObject (événement inputevent) {try {System.out.println ("Send"); Oos.writeObject (événement); Oos.flush (); } catch (exception ef) {ef.printStackTrace (); }Ce qui précède complète l'extrémité de contrôle.
Ensuite, nous construirons l'extrémité contrôlée:
L'extrémité contrôlée doit utiliser le robot pour prendre des captures d'écran et envoyer, et il est nécessaire d'écrire une méthode pour réagir à l'inputevent reçu d'abord: les captures d'écran et envoies:
public static void capturepic () lève Awtexception, ioException {robot = new robot (); Message msg = null; Toolkit tk = java.awt.toolkit.getDefaultToolkit (); java.awt.dimension dm = tk.getScreenSize (); java.awt.robot robot = new java.awt.robot (); pour (int i = 0; i <50; i ++) {// intercepter la zone d'écran de la taille spécifiée rectangle rec = nouveau rectangle (0, 0, (int) dm.getWidth (), (int) dm .getheight ()); BumperedImage Bimage = Robot.CreateSCreencapture (REC); // Enregistrez l'image dans une chaîne de fichiers filepath = "d: // out // Captures d'écran" + i + ".jpeg"; FileOutputStream fops = new FileOutputStream (filePath); javax.imageio.imageio.write (bimage, "jpeg", fops); fops.flush (); fops.close (); msg = nouveau message (filepath); System.out.println (msg.getFileName ()); System.out.println ("Send"); Oos.writeObject (msg); Oos.flush (); }}Notez que ce code utilise le répertoire d: / out / comme lieu de stockage pour les fichiers temporaires. Les lecteurs doivent définir le stockage de documents temporaires par eux-mêmes lors de l'utilisation de ce code.
Ensuite, implémentez le robot pour fonctionner sur l'instruction Inputevent reçue:
public void action () lève Awtexception, classNotFoundException, ioException {robot robot = new robot (); while (true) {inputevent e = (inputevent) ois.readObject (); if (e! = null) {handleevents (robot, e);}}} public static void handleents (Robot Action, inputevent event) {mousevent mevent = null; // Événement de souris Mousewheeevevent mwevent = null; // Événement de défilement de souris keyEvent kevent = null; // Événement de clavier int MouseButtonMask = -100; // Switch Key Key (event.getId ()) {case mousevent.mouse_moved: // Mouvement Mouvement Mevent = (MouseEvent) Event; Action.MousMove (mevent.getx (), mevent.gety ()); casser ; case mouseevent.mouse_primed: // touche de souris appuyez sur mevent = (MouseEvent) événement; Action.MousMove (mevent.getx (), mevent.gety ()); MouseButtonMask = getMousClick (mevent.getButton ()); if (MouseButtonMask! = -100) Action.MousPress (MouseButtonMask); casser; case mouseevent.mouse_relend: // relâchez l'événement de bouton de souris = (mousevent); Action.MousMove (mevent.getx (), mevent.gety ()); MouseButtonMask = getMousClick (mevent.getButton ()); // Obtenez le bouton de la souris si (MouseButtonMask! = -100) Action.MousseRelease (MouseButtonMask); casser ; case MouseEvent.Mouse_Wheel: // Mouse Scroll Mwevent = (MousewheeEvent) Event; action.mousewheel (mwEvent.getwheelrotation ()); casser ; case MouseEvent.Mouse_Dragged: // Mouse Drag Mevent = (MouseEvent) Event; Action.MousMove (mevent.getx (), mevent.gety ()); casser ; case keyevent.key_primed: // kevent kevent = (keyEvent) événement; action.KeyPress (kevent.getKeycode ()); casser ; Case keyevent.key_relend: // Event de Kevent Kevent = (KeyEvent); action.KeyRelease (kevent.getKeycode ()); casser ; par défaut: pause; }} private static int getMousEClick (int bouton) {// Obtenez le bouton de la souris if (bouton == MouseEvent.Button1) // Key gauche, la touche intermédiaire est Button2 return inputevent.button1_mask; if (Button == MouseEvent.Button3) // Retour Retour Inputevent.BUTTON3_MASK; retour -100; }L'ensemble du programme se termine ici. Le programme ci-dessus ne met pas en œuvre l'encapsulation des fils humains robotiques. Le code complet qui peut être utilisé peut être téléchargé à partir des ressources du site suivantes: http://xiazai.vevb.com/201608/yuanma/java-romotecontrol(vevb.com).rar
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.