Code d'instance Java pour implémenter un bureau distant
Le côté de commande passe l'événement de la souris du côté serveur
Après avoir reçu l'événement de souris sur le serveur, il le transmet au client
Une fois que le client a obtenu l'événement de la souris, il peut être terminé via la classe de robot et la capture d'écran sera prise pour envoyer l'image au serveur, et le serveur l'enverra au terminal de contrôle.
Après l'avoir simplifié
// introduire d'abord l'utilisation simple de la classe robot import java.awt.awtexception; import java.awt.robot; import java.awt.event.inputevent; / ** * utiliser robot * @author idiot * * / public classe robottest {public static void main (string [] args) lance awtexception {robot r = new robot (); R.MouseMove (300, 500); // Déplacement de la souris R.MousePress (inputevent.button1_mask); // Mouse Press R.MousseRelease (inputevent.button1_mask); // libération de la souris R.KeyPress ((int) 'a'); // MAQUEBORD PRESS (INT) 'A' signifie convertir A en la touche correspondante du clavier R.Keylelease ((int) 'A'); // Release de maquillage}} // Crawl de l'écran Import Java.awt.awtexception; import java.awt.rectangle; import java.awt.robot; import java.awt.image.bufferedImage; import javax.swing.imageicon; import javax.swing.jframe; import javax.swing.jlabel; import javax.swing.windowConstants; / ** * Crawl Image de bureau locale * @Author Dumb * * / public class Screenst {public static void main (String [] args) lève Awtexception, InterruptedException {robot robot = new robot (); JFrame jFrame = new JFrame (); JFrame.SetSize (1200, 700); JLABEL Label = new JLabel (); jframe.add (label); // quatre paramètres xy hauteur de largeur jframe.setVisible (true); jframe.setDefaultCloseOperation (WindowConstants.exit_on_close); // Construire une interception dynamique de boucle morte while (true) {bufferedImage image = robot.createSCreencapture (new rectangle (0,0,1366,768)); // SeVe the Screen Label.seticon (New ImageIcon (image)); Thread.Sleep (50); }}} // Explication du principe de télécommande
// Le divide-le en fin de serveur et à la fin du client.
// À l'origine, le côté serveur n'est utilisé que comme transfert, mais il n'écrit pas le transfert comme démonstration.
// c'est-à-dire le côté client contrôle le côté serveur e
/ **
* Ce que j'utilise ici, c'est envoyer un événement de souris côté client, c'est-à-dire le côté de contrôle, après avoir reçu l'écran envoyé par le côté serveur,
* Ensuite, utilisez un robot pour le traiter
* La méthode de transmission peut être traitée avec Socket + IO
* La capture d'écran et la compression d'image adoptent la fonction de capture d'écran de Robot et le codeur d'image de JDK pour le convertir en un tableau d'octets
* Après l'avoir envoyé au serveur, le robot peut directement obtenir l'objet objet via une prise IO + et le lancer dans Inputevent (KeyEvent et Mouseevent sont hérités)
* En jugeant le type d'événement, vous pouvez le traiter séparément. Ici, deux threads sont requis sur le serveur, l'un doit dépister et envoyer au client, et l'autre est d'écouter le client.
* Événements passés
* /
// Ce qui suit est le code d'implémentation spécifique
// Le processus principal du serveur Importer Java.awt.awtexception; import java.awt.event; import java.awt.robot; importer java.awt.event.inputevent; import java.awt.event.keyevent; import java.awt.event.mouseevent; import java.io.dataoutputStream; import java. java.io.objectInputStream; Importer java.net.serversocket; import java.net.socket; / ** * server * @author Dumb * * / public class server {public static void main (String [] args) lance ioException {Serversocket Server = new Serversocket (80); System.out.println ("Le serveur a commencé normalement"); Socket socket = server.accept (); // attendant la réception de la demande, bloquant la méthode System.out.println ("il y a une connexion client"); DataOutputStream doss = new DataOutputStream (socket.getOutputStream ()); // Transférer les flux de sortie liés par le client et le serveur ImageThRead Processing ImageThRead ImageThread = new ImageThRead (DOS); Nouveau thread (ImageThRead) .start (); Nouveau thread (nouveau EventThread (new ObjectInputStream (socket.getInputStream ()))). start (); }} / ** * Utilisé pour gérer les événements de souris reçus ou les événements du clavier * / class Eventthread implémente Runnable {private ObjectInputStream oi; robot de robot privé; public EventThread (objectInputStream OIS) {this.OIS = oi; } @Override public void run () {try {robot = new robot (); while (true) {inputevent event = (inputevent) ois.readObject (); // importe que l'objet objet passé par le client est un objet ActionEvent (événement); // Gire Event}} catch (awTexception e) {e.printStackTrace (); } catch (classNotFoundException e) {e.printStackTrace (); } catch (ioException e) {e.printStackTrace (); } enfin {try {ois.close (); } catch (ioException e) {e.printStackTrace (); }}} / ** * Traitement des événements, utilisé pour juger le type d'événement et l'exécuter avec la classe Robot * @param event * / public void actionEvent (événement inputevent) {System.out.println (événement); if (event instanceof keyEvent) {keyEvent e = (keyEvent) Event; int type = e.getId (); // Obtenez le type d'événement if (type == Event.Key_press) {robot.KeyPress (e.getKeycode ()); } else if (type == event.key_release) {robot.keyrelease (e.getKeycode ()); }} else if (instance event instanceof MouseEvent) {MouseEvent e = (mousevent) événement; int type = e.getId (); if (type == event.mouse_move) {robot.mousmove (e.getx (), e.gety ()); } else if (type == event.mouse_down) {robot.mousepress (getMouseKey (type)); } else if (type == event.mouse_up) {robot.mousseRelease (getMouseKey (type)); } else if (type == Event.Mouse_Drag) {robot.mousmove (e.getx (), e.gety ()); // draine de la souris}}}} / ** * renvoie l'événement réel de la souris. Le temps de la souris ne peut pas être traité directement et il doit être converti * @return * / public int getMouseKey (INT Button) {if (Button == MouseEvent.Button1) {// Le bouton de la souris gauche return inputevent.button1_mask; } else if (Button == MouseEvent.Button2) {// Bouton de souris droit Retour inputevent.button2_mask; } else if (Button == MouseEvent.Button3) {// Scroller return inputevent.button3_mask; } else {return 0; }}} // capturer et expéditeur d'écran, ici vous devez obtenir le flux extérieur l'importation du socket java.awt.awtexception; import java.awt.dimension; importer java.awt.rectangle; import java.awt.Robot; java.io.bytearrayoutputStream; import java.io.dataoutputStream; import java.io.ioException; import com.sun.image.codec.jpeg. *; / ** * Utilisé pour envoyer des données d'image * @Author Dumb * * / public class ImageThread Implages Runnable {dataoutPuttream dos = null; // Data Output Stream Public ImageThRead (DataOutputStream DOS) {this.dos = dos; } @Override public void run () {try {robot robot = new robot (); // Sevel toute la dimension de l'écran dimension = toolkit.getDefaultToolkit (). GetScreensize (); / * int width = (int) dimensional.getWidth (); int height = (int) dimensional.getWidth (); Rectangle rec = nouveau rectangle (0,0, largeur, hauteur); * / Rectangle rec = nouveau rectangle (dimension); Image de tamponage; Byte ImageBytes []; while (true) {image = robot.createSCreencapture (rec); imageBytes = getImageBytes (image); Dos.WriteInt (imageBytes.Length); Dos.Write (imageBytes); Dos.Flush (); Thread.Sleep (50); // Sleep Thread}} catch (awTexception e) {e.printStackTrace (); } catch (imageFormatexception e) {e.printStackTrace (); } catch (ioException e) {e.printStackTrace (); } catch (InterruptedException e) {e.printStackTrace (); } enfin {try {if (dos! = null) dos.close (); } catch (ioException e) {e.printStackTrace (); }}} / ** * Image compressée * @Param Pictures qui doivent être compressées * @return compressé Byte Array * @Throws ioException * @throws ImageFormatexception * / public byte [] getImageBytes (BufferedImage Image) lance ImageFormatexception, ioException {byteArAyoutPutStream baos = new ByTearRaytStstream (); // Compressez le compresseur et obtenez-le d'abord dans le flux de sortie de l'octet jPeGImageEncoder jpegd = jPegCodec.CreateJpeGencoder (BAOS); // compress iamge jpegd.encode (image); // Converti en return de relevé d'octets baos.toByteArray (); }} --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- java.io.objectoutputStream; import java.net.socket; import java.net.unknownhostException; import javax.swing.imageicon; importer javax.swing.jframe; import javax.swing.jlabel javax.swing.windowConstants; / ** * Client * @author Dumb * * / public class Client {public static void main (String args []) lève un inconnue, ioException {socket s = new socket ("127.0.0.1", 80); DatAnputStream dis = new DatAnputStream (s.getInputStream ()); ObjectOutputStream oos = new ObjectOutputStream (s.getOutputStream ()); ClientWindow CW = new ClientWindow (OOS); octet [] ImageBytes; while (true) {imageBytes = new Byte [dis.readInt ()]; // Obtenez d'abord la longueur du tableau passé dis.readly (imageBytes); // Stockage toutes les données dans Byte CW.RepainImage (ImageBytes); }}} / ** * Client Form * @Author Dumb * * / class ClientWindow étend JFrame {private ObjectOutputStream OOS; Label JLabel privé; // réécriture de la méthode d'image d'arrière-plan public void reineImage (byte [] imagebytes) {label.seticon (new ImageIcon (imageBytes)); this.repaint (); } public clientwindow (objectOutputStream oos) {this.oos = oos; this.setTitle ("programme de télécommande"); label = new JLabel (); Jpanel p = new JPanel (); P.ADD (label); JscrollPane Scroll = new JscrollPane (p); // ajouter une barre de scroll au panneau P this.add (scroll); this.setSize (1024 768); this.setDefaultCloseOperation (WindowConstants.exit_on_close); this.setVisible (true); this.addkeyListener (new KeyListener () {@Override public void keyTyped (keyEvent e) {// TODO Méthode générée automatiquement Stub} @Override public void keyrelent (keyEvent e) {SendEvevent (e);} @Override public void keypessée (keyEvent e) {Senvevent (e);}}); Label.AddMouseListener (new MouseListener () {@Override public void MouseLele tourn MouseEnteRed (MouseEvent E) {// TODO Méthode générée automatique Stub} @Override public void MouseExit (MouseEvent e) {// TODO Méthode générée automatiquement Stub}}); } public void SendEvent (événement inputevent) {try {oos.writeObject (événement); } catch (ioException e) {e.printStackTrace (); }}}L'exemple de code ci-dessus pour l'implémentation Java de Remote Desktop est tout le contenu que j'ai partagé avec vous. J'espère que vous pourrez vous faire référence et j'espère que vous pourrez soutenir Wulin.com plus.