Java implementiert Fernsteuerungstechnologie
Eine Mischung aus Java.net und java.awt.robot, die mit Java ausgestattet sind, kann verwendet werden, um die Fernbedienung eines anderen Computers über dem Netzwerk zu realisieren, einschließlich der Steuerung der Bewegung der Remote -Computermaus und der Eingabe der Tastatur und der Erhalt von Bildern des Remote -Computerbildschirms in Echtzeit. In diesem Artikel wird eine kurze Sprache und Logik von flach bis tief verwendet, um Ihnen beizubringen, wie Sie diese Technik beherrschen.
Schauen wir uns zunächst die Renderings an:
Remote -Computerschnittstelle:
Steuerungsanschluss -Computerschnittstelle:
Steuerterminaleingabe:
Ferneingang:
Beginnen wir mit der detaillierten Einführung der technischen Ideen der Fernbedienung.
Zunächst werden die beiden Computer über den Socket von Java.net verbunden.
Öffnen Sie zuerst ein Serversocket an einem Ende und verbinden Sie sich dann mit dem anderen Ende mit einer Steckdose.
Serverseite
Ein Serversocket sollte eingerichtet werden und die benötigten Eingangs- und Ausgangsströme werden initialisiert:
public static void openServer () löst ioException, classNotFoundException {System.out.println ("Serverstart ......") aus; ServerSocket Server = New ServerSocket (7777); socket = server.accept (); System.out.println ("on Connection .../n"+Socket); OIS = new ObjectInputStream (Socket.getInputStream ()); OOS = new ObjectOutputStream (Socket.getOutputStream ()); }Client Side <BR /> Die Socket sollte verwendet werden, um eine Verbindung zum Server herzustellen und den Eingangs- und Ausgabestream zu initialisieren:
public static void startConnection (String IP, int Port) löst UnbekannteHostException, ioException, awtexception {Socket = New Socket ("192.168.0.106", 7777) aus; if (socket.isconnected ()) {System.out.println ("Socket Connected ..."+Socket); } OOS = new ObjectOutputStream (socket.getOutputStream ()); OIS = new ObjectInputStream (Socket.getInputStream ()); }Auf diese Weise werden die beiden Computer miteinander verbunden und Daten können über Streams (InputStream und OutputStream) ausgetauscht werden.
Als nächstes können Sie überlegen, welche Informationen zwei Computer gegen Fernsteuerung austauschen müssen? Zuerst muss das kontrollierte Ende das Bildschirmbild kontinuierlich für das Steuerende bereitstellen (dies wird mit java.awt.robot implementiert), und dann führen die Maus und die Tastatur den gleichen Betrieb aus, basierend auf dem vom Steuerende übertragenen Ereignis (InputEvent) (implementiert mit dem Roboter). Anschließend muss das Steuerende zuerst das vom gesteuerte Ende übertragene Bild empfangen und es in einem Panel (Bereich) reflektieren, dann die Aktionen der Tastatur und der Maus auf der Maschine überwachen und dann an den Host des kontrollierten Endes weitergeben (wir können dies tun, indem wir einen Hörer auf den Panelbereich einstellen).
Ein hier aufgetretenes Problem ist, dass die für die Übertragung verwendeten Bilder nicht serialisiert werden können, unabhängig davon, ob sie Bild oder Bufferen verwenden. Daher kann I/Ostream nicht für die Übertragung verwendet werden. Um dieses Problem zu lösen, müssen wir daher die Bilddaten in einer Klasse zusammenfassen und die serialisierbare Schnittstellenbildklasse wie folgt implementieren:
import Java.io.file; import java.io.fileinputstream; import java.io.filenotFoundException; importieren java.io.ioxception; import Java.io.ioSerializable; privater String -Dateiname; // Dateiname private Long Filelength; // Dateilänge private Byte [] filecontent; // Dateiinhalte öffentliche Nachricht () {} öffentliche Nachricht (String filepath) löst IOException {File Datei = neue Datei (FilePath) aus; this.Filelength = Datei.length (); this.filename = file.getName (); FileInputStream fis = new FileInputStream (FilePath); byte [] bytes = new byte [(int) filelength]; Fis.read (bytes, 0, (int) filelength); this.filecontent = bytes; } public String getFileName () {return Dateiname;} public void setFileName (String Dateiname) {this.FileName = Dateiname;} public Long GetFilelength () {return filelength; } public void setFilelength (lange FileLength) {this.Filelength = filelength;} public byte [] getFileContent () {return fileContent;} public void setfileContent (byte [] fileContent) {this.fileContent = filecontent;}}}}}Dadurch kann das Bild durch Serialisierung von ObjectInputStream und ObjectOutputStream verbreitet werden
Nach dem Verständnis der oben genannten Grundlagen müssen wir zunächst die Einstellung der Benutzeroberfläche, die Bildempfang sowie die Überwachung der Kontrollseite der Tastatur und der Mauswirkung vervollständigen:
Richten Sie zunächst das Empfangsbild ein:
public static void reveepic () löst ClassNotFoundException, ioException {message g = (message) ois.readObject () aus; 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); Bild img = iic.getImage (); Toolkit tk = Toolkit.getDefaulttoolkit (); Dimension d = tk.getScreensize (); int w = d.width; int h = d.height; BufferedImage BI = Größen (IMG, 800.600); Image_Lab.Seticon (New Imageicon (bi)); img_lab.repaint (); // pind den Hintergrund weg, den ich vor} private statische Bufferedimage -Größe (Bild img, int neww, int newh) {int w = img.getwidth (null); int h = img.gethoight (null); Bufferedimage dimg = new bufferedimage (neww, newh, bufferedimage.type_int_bgr); Graphics2d 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.disponse (); DIMG zurückgeben; }Auf diese Weise kann nach dem Empfangen der Nachrichtenklasse aus ObjectInputStream das Bild auf die Größe des Feldbereichs zurückgesetzt und angezeigt werden
Der nächste Schritt ist das Festlegen von Panel -Eigenschaften und -Hörern:
public static void showui () {// Konsole -Titel JFrame jf = new Jframe ("console"); SetListener (JF); // Konsolengröße JF.Setsize (500, 400); // Imag_Lab wird verwendet, um das Bild bild_lab = new JLabel () zu speichern; jf.add (image_lab); // setvisible (true); // Konsole Top JF.Setalwaysontop (True); JF.SetResizable (true); jf.setDefaultCloseOperation (jframe.exit_on_close); }Hörer:
public static void setListener (JFrame Frame) {// Panel Set Listener Frame.AddKeyListener (neuer KeyAdapter () {public void keypressed (keyEvent e) {sendEventObject (e);} @Override public void keyrreased (keyEvent e) {SendEventObject (e); }); Frame.AddMousewheellistener (New Mousewheellistener () {public void Mauskala (Mauswade E) {sendEventObject (e);}}); Frame.AddMousemotionListener (new MousemotionListener () {public void mouseDragged (mouseEvent e) {sendEventObject (e);} public void mousemoved (MouseEvent e) {sendEventObject (e);}}}); Frame.AddMouselistener (neuer Mouselistener () {public void mouseclicked (MouseEvent e) {sendEventObject (e); MouseSed (MouseEvent e) {sendEventObject (e); } private static void sendEventObject (InputEvent Ereignis) {try {System.out.println ("send"); OOS.WriteObject (Ereignis); Oos.flush (); } catch (Ausnahme ef) {ef.printstacktrace (); }Das obige Abschluss vervollständigt das Kontrollende.
Als nächstes werden wir das kontrollierte Ende erstellen:
Das kontrollierte Ende muss Roboter verwenden, um Screenshots und zu senden, und es ist notwendig, eine Methode zu schreiben, um zuerst auf die empfangenen InputEvent: Die Screenshots und Senden zu reagieren:
public static void Captainpic () löst Awtexception aus, ioException {Robot = new Robot (); Nachricht msg = null; Toolkit tk = java.awt.toolkit.getDefaulttoolkit (); java.awt.dimension dm = tk.getScreensize (); java.awt.robot robot = new java.awt.robot (); für (int i = 0; i <50; i ++) {// Abfangen den Bildschirmbereich der angegebenen Größe Rechteck rec = neues Rechteck (0, 0, (int) dm.getWidth (), (int) dm .getheight ()); Bufferedimage bimage = roboter.createScreencapture (rec); // das Bild in einer Datei string filepath = "d: // out // screenshot"+i+".jpeg" speichern; FileOutputStream fops = new FileOutputStream (FilePath); Javax.imageo.imageo.Write (Bimage, "JPEG", FOPS); fops.flush (); fops.close (); msg = neue Nachricht (filepath); System.out.println (msg.getFileName ()); System.out.println ("send"); OOS.WriteObject (MSG); Oos.flush (); }}Beachten Sie, dass dieser Code das D:/ Out/ Out/ Out/ Verzeichnis als Speicherplatz für temporäre Dateien verwendet. Die Leser müssen den Speicher von temporären Dokumenten selbst festlegen, wenn Sie diesen Code verwenden.
Implementieren Sie dann Roboter, um mit der empfangenen InputEvent -Anweisung zu arbeiten:
public void action () löscht awtexception, classNotFoundException, IOException {Robot Robot = new Robot (); while (true) {InputEvent e = (inputEvent) ois.readObject (); if (e! = null) {handleEvents (Robot, e);}}} public static void HandleEvents (Robot -Aktion, InputEvent Ereignis) {MouseEvent mevent = null; // Mausereignis Mauswade MWEVENT = NULL; // Maus -Scroll -Ereignis keyEvent kevent = null; // Tastaturereignis int MausbuttonMask = -100; // Mausschlüsselschalter (Event.GetID ()) {case MouseEvent.Mouse_Moved: // Mausbewegung mevent = (mouseEvent) Ereignis; action.mousemove (mevent.getX (), mevent.gety ()); brechen ; case mouseEvent.mouse_presse: // Mausschlüssel drücken Sie MEvent = (MouseeEvent) Ereignis; action.mousemove (mevent.getX (), mevent.gety ()); Mausbuttonmask = getMouseclick (mevent.getButton ()); if (mausbuttonmask! brechen; case mouseEvent.mouse_released: // das Maustaste mevent = (mouseEvent) ereignis; action.mousemove (mevent.getX (), mevent.gety ()); Mausbuttonmask = getMouseclick (mevent.getButton ()); // die Maustaste erhalten, wenn (Mausbuttonmask! brechen ; case mouseEvent.mouse_Wheel: // Maus Scroll Mwevent = (MauswheelEvent) Ereignis; action.mousewheel (mwevent.getWheelrotation ()); brechen ; case mouseEvent.mouse_dragged: // Maus Drag mevent = (MouseeEvent) Ereignis; action.mousemove (mevent.getX (), mevent.gety ()); brechen ; case keyEvent.key_pressed: // key kevent = (keyEvent) Ereignis; action.Keypress (kevent.getKeyCode ()); brechen ; case keyEvent.key_released: // gelöst Taste Kevent = (KeyEvent) Ereignis; action.Keyrelease (kevent.getKeyCode ()); brechen ; Standard: Break; }} private statische int getMouseclick (int button) {// Die Maustaste abrufen, wenn (button == mouseEvent.button1) // linke Schlüssel, die mittlere Taste button2 return event.button1_mask; if (button == mouseEvent.button3) // rechter Schlüssel return inputEvent.button3_mask; Rückkehr -100; }Das ganze Programm endet hier. Das obige Programm implementiert keine Kapselung von Roboter -Menschenfäden. Der vollständige Code, der verwendet werden kann, kann von den folgenden Site-Ressourcen heruntergeladen werden: http://xiazai.vevb.com/201608/yuanma/java-romotecontrol(vevb.com).rar
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.