Java implementa la tecnología de control remoto
Una mezcla de java.net y java.awt.robot., Que viene con Java, se puede utilizar para realizar el control remoto de otra computadora sobre la red, incluido el control del movimiento del mouse remoto de la computadora y la entrada del teclado, y obtener imágenes de la pantalla de computadora remota en tiempo real. Este artículo utilizará un lenguaje y lógica concisos de superficie a profundo para enseñarle cómo dominar esta técnica.
Primero, echemos un vistazo a las representaciones:
Interfaz de computadora remota:
Interfaz de la computadora terminal de control:
Entrada del terminal de control:
Entrada remota:
Comencemos con la introducción detallada de las ideas técnicas del control remoto.
Primero, las dos computadoras están conectadas a través del zócalo de java.net.
Primero abra un ServingSock en un extremo y luego conéctese con el otro extremo con un socket.
Lado del servidor
Se debe configurar un servidor y se inicializan las secuencias de entrada y salida que se requieren:
public static void openServer () lanza IOException, ClassNotFoundException {System.out.println ("ServerStart ..."); ServerSocket Server = nuevo Serversocket (7777); socket = server.accept (); System.out.println ("en conexión .../n"+socket); Ois = nuevo ObjectInputStream (Socket.GetInputStream ()); Oos = new ObjectOutputStream (Socket.getOutputStream ()); }Lado del cliente <Br /> El socket debe usarse para conectarse al servidor e inicializar la secuencia de entrada y salida:
Public static void startConnection (String IP, int Port) arroja desconocidoHostException, ioException, awtexception {socket = new Socket ("192.168.0.106", 7777); if (socket.isconnected ()) {System.out.println ("Socket Connected ..."+Socket); } Oos = new ObjectOutputStream (Socket.getOutputStream ()); Ois = nuevo ObjectInputStream (Socket.GetInputStream ()); }De esta manera, las dos computadoras están vinculadas y los datos se pueden intercambiar a través de las secuencias (InputStream y OutputStream).
A continuación, puede pensar en qué información necesitan dos computadoras para intercambiar por el control remoto. Primero, el extremo controlado debe proporcionar continuamente la imagen de la pantalla al final de control (esto se implementará utilizando java.awt.robot), y luego el mouse y el teclado realizan la misma operación en función del evento (inptevent) transmitido por el extremo de control (implementado usando robot). Luego, el extremo de control primero debe recibir la imagen transmitida por el extremo controlado y reflejarla en un panel (panel), luego monitorear las acciones del teclado y el mouse en la máquina y luego pasarla al host del extremo controlado (podemos hacerlo configurando un oyente en el panel del panel)
Un problema encontrado aquí es que las imágenes utilizadas para la transmisión no se pueden serializar si están usando imagen o bufferedimage. Por lo tanto, I/Ostream no se puede usar para la transmisión. Por lo tanto, para resolver este problema, necesitamos encapsular los datos de la imagen en una clase e implementar la clase de imagen de la interfaz de serializable de la siguiente manera:
import java.io.file; import java.io.fileinputstream; import java.io.filenotfoundexception; import java.io.ioxception; import java.io.Serializable; Mensaje de clase pública implementa serializable {Private estático final Long SerialVersionuid = 1l; nombre de archivo de cadena privada; // Nombre de archivo Private Long Filelength; // Longitud de archivo Byte privado [] fileContent; // File Content Public Message () {} public Mensaje (String FilePath) lanza IOException {archivo archivo = nuevo archivo (filePath); this.filelength = file.length (); this.FileName = file.getName (); FileInputStream fis = new FileInputStream (FilePath); byte [] bytes = new byte [(int) fileLength]; Fis.read (bytes, 0, (int) filel longitud); this.fileContent = bytes; } public String getFileName () {return FileName;} public void setFileName (string fileName) {this.fileName = filename;} public long Long getFilelength () {return fileLength; } public void setFileLelgent (long filelength) {this.filelength = fileLength;} public byte [] getFileContent () {return fileContent;} public void setFileContent (byte [] fileContent) {this.fileContent = fileContent;}}Esto permite que la imagen se propague a través de la serialización de ObjectInputStream y ObjectOutputStream
Después de comprender los conceptos básicos anteriores, primero debemos completar la configuración de la interfaz de UI, la recepción de imagen y el monitoreo de la acción del teclado y el mouse del lado de control:
Primero, configure la imagen receptora:
public static void reveivePic () lanza ClassNotFoundException, ioException {Message g = (Mensaje) 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); Imagen img = iic.getImage (); Toolkit tk = toolkit.getDefaultToolkit (); Dimensión d = tk.getScreensize (); int w = d.width; int h = d.Height; BufferedImage BI = RESEZE (IMG, 800,600); image_lab.Seticon (New Imageicon (BI)); img_lab.Repaint (); // Pind Afray el fondo que dibujé antes} RESEDE DE BUBEDIMAGE ESTÁTICO PRIVAD int h = img.getheight (nulo); BufferedImage Dimg = new BufferedImage (Neww, Newh, BufferedImage.Type_int_Bgr); Gráfico2d g = dimg.createGraphics (); G.SetRenderingHint (renderinghints.key_interpolation, renderinghints.value_interpolation_bilinear); G.DrawImage (img, 0, 0, Neww, Newh, 0, 0, W, H, Null); G.Dispose (); devolver dimg; }De esta manera, después de recibir la clase de mensaje de ObjectInputStream, la imagen se puede restablecer al tamaño del panel del panel y se muestra
El siguiente paso es establecer propiedades y oyentes del panel:
public static void showui () {// Título de la consola Jframe jf = new Jframe ("Consola"); setListener (JF); // tamaño de la consola jf.setsize (500, 400); // imag_lab se usa para almacenar la imagen imag_lab = new JLabel (); jf.add (imag_lab); // setVisible (verdadero); // Consola TOP JF.SetAlwayStop (verdadero); jf.setResizable (verdadero); jf.setDefaultCloseOperation (jframe.exit_on_close); }Oyente:
public static void setListener (jframe frame) {// panel set del oyente frame.addkeylistener (new KeyAdapter () {public void keyPressed (keyEvent e) {sendEventObject (e);} @Override public void keyReleed (keyEvent e) {sendEventObject (e);} @Override void keyTeped (keyeSeed E) }); Frame.AddMouseWheListener (new MouseWheellistener () {public void MouseWheelMoved (MousewheelEvent e) {sendEventObject (e);}}); Frame.AddMouseMotionListener (new MouseMotionListener () {public void Mousedragged (MouseEvent e) {sendEventObject (e);} public void mouseMoved (mouseEvent e) {sendEventObject (e);}}); Frame.AddMouseListener (new MouseListener () {public void MouseClicked (MouseEvent e) {sendEventObject (e);} public void mouseEndered (mouseEvent e) {sendEventObject (e);} public void mouseeExited (mousevent e) {sendEventObject (e);} public void void (mouseeExited (MouseEvent e) e) {sendEventObject (e); } private static void sendEventObject (evento inPutevent) {try {System.out.println ("Enviar"); Oos.writeObject (evento); Oos.flush (); } catch (excepción ef) {ef.printstacktrace (); }Lo anterior completa el final de control.
A continuación, construiremos el extremo controlado:
El extremo controlado debe usar Robot para tomar capturas de pantalla y enviar, y es necesario escribir un método para reaccionar primero al inptevent recibido: las capturas de pantalla y envía:
public static void capturePic () lanza awtexception, ioexception {robot = new Robot (); Mensaje msg = nulo; Toolkit tk = java.awt.toolkit.getdefaultToolkit (); java.awt.dimension dm = tk.getScreensize (); java.awt.robot robot = new java.awt.robot (); para (int i = 0; i <50; i ++) {// intercepta el área de pantalla del tamaño especificado Rectangle rec = nuevo rectángulo (0, 0, (int) dm.getWidth (), (int) dm .getheight ()); BufferedImage bimage = robot.createScreencapture (rec); // Guardar la imagen en una cadena de archivo filePath = "d: // out // captura de pantalla"+i+".jpeg"; FileOutputStream fops = new FileOutputStream (FilePath); javax.imageio.imageio.write (bimage, "jpeg", fops); fops.flush (); fops.close (); msg = nuevo mensaje (filepath); System.out.println (msg.getFileName ()); System.out.println ("enviar"); Oos.writeObject (MSG); Oos.flush (); }}Tenga en cuenta que este código usa el directorio D:/ OUT/ como el lugar de almacenamiento para archivos temporales. Los lectores deben establecer el almacenamiento de documentos temporales por sí mismos al usar este código.
Luego implementa el robot para operar con la instrucción inptevent recibida:
public void Action () lanza awtexception, classnotFoundException, ioException {robot robot = new Robot (); while (true) {inPutevent e = (inPutevent) ois.readObject (); if (e! = null) {handleEvents (robot, e);}}} public static void manyEvents (Robot Action, inPutevent Event) {mouseEvent mevent = null; // Evento de mouse mousewheelevent mwevent = null; // ratón de desplazamiento de desplazamiento keyEvent KeVent = null; // Evento de teclado int mouseButtonmask = -100; // Switch de teclas de mouse (event.getId ()) {case mouseEvent.Mouse_Moved: // Movimiento de mouse mevent = (mouseEvent) evento; Action.MouseMove (mevent.getx (), mevent.gety ()); romper ; case mouseevent.mouse_pressed: // llave de mouse presione mevent = (mouseEvent) evento; Action.MouseMove (mevent.getx (), mevent.gety ()); mouseButtonmask = getMouseClick (mevent.getButton ()); if (mouseButtonmask! = -100) Action.Mousepress (MouseButtonmask); romper; case mouseEvent.Mouse_Releaded: // libera el botón del mouse mevent = (mouseEvent) evento; Action.MouseMove (mevent.getx (), mevent.gety ()); mouseButtonmask = getMouseClick (mevent.getButton ()); // Obtenga el botón del mouse if (MouseButtonmask! = -100) Action.MoUserelease (MouseButtonmask); romper ; case mouseevent.mouse_wheel: // mouse scroll mwevent = (mousewheelevent) evento; Action.MouseWheel (mwevent.getwheelrotation ()); romper ; case mouseevent.mouse_dragged: // mouse drag mevent = (mouseEvent) evento; Action.MouseMove (mevent.getx (), mevent.gety ()); romper ; Case keyEvent.key_pressed: // key kevent = (keyEvent) evento; Action.KeyPress (kevent.getKeyCode ()); romper ; Case KeyEvent.Key_RelEed: // SOLEVE KEY KEVVE = (KEYEVENT) Evento; Action.KeyReLease (kevent.getKeyCode ()); romper ; predeterminado: ruptura; }} private static int getMouseClick (int button) {// Obtenga el botón del mouse if (botón == MouseEvent.Button1) // La tecla izquierda, la tecla central es botón2 return inPutevent.Button1_mask; if (botón == MouseEvent.Button3) // clave correcta return inputevent.button3_mask; regreso -100; }Todo el programa termina aquí. El programa anterior no implementa la encapsulación de hilos humanos robóticos. El código completo que se puede usar se puede descargar de los siguientes recursos del sitio: http://xiazai.vevb.com/201608/yuanma/java-romotecontrol(vevb.com).rar
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.