Código de instancia de Java para implementar escritorio remoto
El lado de control pasa el evento del mouse al lado del servidor
Después de recibir el evento del mouse en el servidor, lo transmite al cliente
Después de que el cliente obtenga el evento del mouse, se puede completar a través de la clase Robot, y la captura de pantalla se tomará para enviar la imagen al servidor, y el servidor la enviará al terminal de control.
Después de simplificarlo
// Primero introduzca el uso simple de la clase Robot import java.awt.awtexception; import java.awt.robot; import java.awt.event.inputevent;/** * use robot * @author dumb * */public robottest {public static void main (string [] args) lanza awtexception {robot r = new robot (); R.MouseMove (300, 500); // Mouse Move R.Mousepress (inPutevent.Button1_MASK); // Mouse Press R.MoUserelease (inPutevent.Button1_Mask); // Rate rate R.KeyPress ((int) 'a'); // Makeboard Press (int) 'a' significa convertir A en la tecla correspondiente del teclado r.KeyReLease ((int) 'a'); // MAKEBODS Release}} // Screen Crawl 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 de la imagen de escritorio local* @author Dumb**/public class Screentest {public static void main (string [] args) lanza awtexception, interrumpedexception {robot robot = new robot (); Jframe jframe = new Jframe (); jframe.setsize (1200, 700); Jlabel etiqueta = new JLabel (); jframe.add (etiqueta); // cuatro parámetros de altura de ancho xy jframe.setVisible (true); jframe.setDefaultCloseOperation (WindowsConstants.exit_on_close); // Construye una intersección dinámica de bucle muerto mientras (verdadero) {bufferedImage image = robot.createScreencapture (nuevo rectángulo (0,0,1366,768)); // seave la etiqueta de la pantalla. Thread.sleep (50); }}} // Explicación del principio del control remoto
// divídalo en el final del servidor y el final del cliente.
// Originalmente, el lado del servidor solo se usa como reenvío, pero no escribe el reenvío como una demostración.
// es decir, el lado del cliente controla el lado del servidor E
/**
* Lo que uso aquí es enviar un evento de mouse al lado del cliente, es decir, el lado de control, después de recibir la pantalla enviada por el lado del servidor,
* Luego use Robot para procesarlo
* El método de transmisión se puede procesar con Socket+IO
* Captura de pantalla y compresión de imagen adopta la función de captura de pantalla de Robot y el codificador de imágenes de JDK para convertirlo en una matriz de bytes
* Después de enviarlo al servidor, el robot puede obtener directamente el objeto del objeto a través de io+socket, y colocarlo en inptevent (se heredan KeyVent y MouseEvent)
* Al juzgar el tipo de evento, puede procesarlo por separado. Aquí, se requieren dos hilos en el servidor, uno es para detectar y enviar al cliente, y el otro es escuchar al cliente.
* Eventos aprobados
*/
// El siguiente es el código de implementación específico
// El proceso principal del servidor importe java.awt.awtexception; import java.awt.event; import java.awt.robot; import java.awt.event.inputevent; import java.awt.event.keyevent; import java.awt.event.MouseEvent; import java.io.datautstream; importar java.awt.event; importación; importar; java.io.ObjectInputStream; import java.net.serversocket; import java.net.socket;/*** servidor* @author dumb**/public class Server {public static void main (string [] args) lanza IOException {Serversocket Server = New Serversocket (80); System.out.println ("El servidor ha comenzado normalmente"); Socket Socket = server.accept (); // Esperando recibir la solicitud, bloqueando el método System.out.println ("Hay una conexión de cliente"); DataOutputStream dos = new DataOutputStream (Socket.getOutputStream ()); // Transferir las transmisiones de salida vinculadas por el cliente y el lado del servidor ImagetHread Processing Imagethread imagethread = new Imagethread (DOS); nuevo hilo (imagethread) .Start (); nuevo hilo (nuevo eventThread (nuevo ObjectInputStream (Socket.GetInputStream ()))). Start (); }}/*** Se usa para manejar eventos de mouse recibidos o eventos de teclado*/class EventThread implementa Runnable {private ObjectInputStream OIS; robot privado robot; public EventThread (ObjectInputStream OIS) {this.ois = ois; } @Override public void run () {try {robot = new Robot (); while (true) {inPutevent event = (inPutevent) ois.readObject (); // Importar que el objeto el objeto aprobado por el cliente es un objeto ActionEvent (event); // Handle Event}} Catch (awtexception e) {e.printstackTrace (); } catch (ClassNotFoundException e) {E.PrintStackTrace (); } catch (ioException e) {E.PrintStackTrace (); } finalmente {try {ois.close (); } catch (ioException e) {E.PrintStackTrace (); }}} / *** Procesamiento de eventos, utilizado para juzgar el tipo de evento y ejecutarlo con la clase Robot* @param Event* / public void ActionEvent (Event InPutevent) {System.out.println (evento); if (Event OstoneOf KeyEvent) {keyEvent e = (keyEvent) evento; int type = e.getId (); // Obtener el tipo de evento if (type == event.key_press) {robot.keypress (e.getKeyCode ()); } else if (type == Event.Key_Release) {Robot.KeyReLease (E.GetKeyCode ()); }} else if (event instancia de mouseEvent) {mouseEvent e = (mouseEvent) evento; int type = e.getId (); if (type == event.mouse_move) {robot.mouseMove (e.getx (), e.gety ()); } else if (type == Event.Mouse_Down) {Robot.MousePress (getMouseKey (type)); } else if (type == Event.Mouse_Up) {Robot.MoUserelease (getMouseKey (type)); } else if (type == event.mouse_drag) {robot.mouseMove (E.getx (), e.gety ()); // mouse drag}}}}/*** Devuelve el evento real del mouse. El tiempo del mouse no se puede procesar directamente, y debe convertirse * @return */public int getMousekey (int button) {if (botutero == MouseEvent.Button1) {// El botón izquierdo del mouse return inPutevent.button1_mask; } else if (botón == MouseEvent.Button2) {// Botón de mouse derecho return inPutevent.Button2_MASK; } else if (button == MouseEvent.Button3) {// Scroller return inputevent.button3_mask; } else {return 0; }}} // Capturador y remitente de pantalla, aquí debe obtener la importación de flujo fuera del socket java.awt.awtexception; import java.awt.dimension; import java.awt.rectangle; import java.awt.robot; import java.awt.toolkit; import; java.io.bytearrayOutputStream; import java.io.dataOutputStream; import java.io.ioException; import com.sun.image.codec.jpeg.*;/*** Se usó para enviar datos de imagen* @author dumb**/clase pública imageThread implementa runnable {dataOutStream dos = null; // Data Output Stream public Imagethread (DataOutputStream Dos) {this.dos = dos; } @Override public void run () {try {robot robot = new Robot (); // seaVe toda la dimensión de la pantalla dimensión = toolkit.getDefaultToolkit (). GetsCreensize (); /* int width = (int) dimensional.getWidth (); int hight = (int) dimensional.getWidth (); Rectángulo rec = nuevo rectángulo (0,0, ancho, altura); */ Rectangle rec = new Rectangle (dimensión); Imagen de BufferedImage; byte imageBytes []; while (true) {image = robot.createScreencapture (rec); imageBytes = getImagebytes (imagen); dos.WriteInt (imageBytes.length); dos.write (ImageBytes); dos.flush (); Thread.sleep (50); // hilo de sueño}} Catch (awtexception e) {E.PrintStackTrace (); } catch (ImageFormateException e) {E.PrintStackTrace (); } catch (ioException e) {E.PrintStackTrace (); } catch (InterruptedException e) {E.PrintStackTrace (); } finalmente {try {if (dos! = null) dos.close (); } catch (ioException e) {E.PrintStackTrace (); } } } /** * Compressed image* @param Pictures that need to be compressed* @return Compressed byte array* @throws IOException * @throws ImageFormatException */ public byte[] getImageBytes(BufferedImage image) throws ImageFormatException, IOException{ ByteArrayOutputStream baos = new ByteArrayOutputStream(); // Comprime el compresor y primero obténlo en la transmisión de salida de bytes jpegimageEncoder jpegd = jpegcodec.createjpegencoder (baos); // compresa iamge jpegd.encode (imagen); // convertir a byte array return baos.tobytearray (); }} --------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- java.io.ObjectOutputStream; import java.net.socket; import java.net.unknownHostException; import javax.swing.imageicon; import javax.swing.jframe; import javax.swing.jlabel; import javax.swing.jpanel; import javax.swing.jscrollpane; import; import; importar; importar; import javax.swing.windowconstants;/*** Client* @author Dumb**/public class Client {public static void main (string args []) lanza desconocidoHostException, ioexception {socket s = nuevo socket ("127.0.0.1", 80); DataInputStream dis = new DataInputStream (s.getInputStream ()); ObjectOutputStream oos = new ObjectOutputStream (s.getOutputStream ()); ClientWindow CW = New ClientWindow (OOS); byte [] imageBytes; while (true) {imageBytes = new byte [dis.readInt ()]; // Primero obtenga la longitud de la matriz pasada. // almacenar todos los datos en byte cw.repainimage (imageBytes); }}}/*** Formulario de cliente* @author Dumb**/class ClientWindow extiende jframe {private objectOutputStream oos; Etiqueta privada Jlabel; // Reescribir el método de imagen de fondo public void ReprainImage (byte [] imageBytes) {etiqueta this.Repaint (); } public ClientWindow (ObjectOutputStream OOS) {this.oos = oos; this.settitle ("Programa de control remoto"); etiqueta = new JLabel (); Jpanel p = new jpanel (); p.Add (etiqueta); JSCrollPane Scroll = new JSCrollPane (P); // Agregar barra de desplazamiento al panel p this.add (scroll); this.setsize (1024,768); this.setDefaultCloseOperation (WindowsConstants.exit_on_close); this.setVisible (verdadero); this.AddkeyListener (new KeyListener () {@Override public void KeyTyped (KeyEvent E) {// TODO Auto Generado Method Stub} @Override public void KeyReleed (KeyEvent E) {SendEvent (e);} @Override public etiqueta Mouseentered (MouseEvent E) {// TODO Auto Generado Método STUB} @Override public void MouseExited (MouseEvent E) {// TODO Auto Generated Method Stub}}); } public void sendEvent (evento inPutevent) {try {oos.writeObject (evento); } catch (ioException e) {E.PrintStackTrace (); }}}El código de ejemplo anterior para la implementación de Java del escritorio remoto es todo el contenido que he compartido con usted. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.