Java implementa a tecnologia de controle remoto
Uma mistura de java.net e java.awt.robot., Que vem com Java, pode ser usada para obter o controle remoto de outro computador sobre a rede, incluindo o controle do movimento do mouse remoto de computador e a entrada do teclado e a obtenção de imagens da tela remota do computador em tempo real. Este artigo usará linguagem e lógica concisas de superficial para profundo para ensiná -lo a dominar essa técnica.
Primeiro, vamos dar uma olhada nas renderizações:
Interface de computador remota:
Interface do computador do terminal de controle:
Entrada do terminal de controle:
Entrada remota:
Vamos começar com a introdução detalhada das idéias técnicas de controle remoto.
Primeiro, os dois computadores são conectados através do soquete do java.net.
Primeiro abra um ServerSocket em uma extremidade e, em seguida, conecte -se com a outra extremidade com um soquete.
Lado do servidor
Um servidorsocket deve ser configurado e os fluxos de entrada e saída necessários são inicializados:
public static void OpenServer () lança IoException, ClassNotFoundException {System.out.println ("ServerStart ......"); Serversocket Server = new ServerSocket (7777); soquete = server.accept (); System.out.println ("na conexão .../n"+soquete); OIS = new ObjectInputStream (Socket.getInputStream ()); OOS = new ObjectOutputStream (Socket.getOutputStream ()); }Lado do cliente <br /> O soquete deve ser usado para se conectar ao servidor e inicializar o fluxo de entrada e saída:
public static void startConnection (string ip, porta int) lança desconhecidohostException, ioexception, awtexception {socket = new Socket ("192.168.0.106", 7777); if (socket.isconnected ()) {System.out.println ("soquete conectado ..."+soquete); } OoS = new ObjectOutputStream (Socket.getOutputStream ()); OIS = new ObjectInputStream (Socket.getInputStream ()); }Dessa forma, os dois computadores estão vinculados e os dados podem ser trocados por meio de fluxos (InputStream e OutputStream).
Em seguida, você pode pensar em quais informações dois computadores precisam trocar por controle remoto? Primeiro, a extremidade controlada precisa fornecer continuamente a imagem da tela para a extremidade de controle (isso será implementado usando o java.awt.robot) e, em seguida, o mouse e o teclado fazem a mesma operação com base no evento (inputevent) transmitido pela extremidade de controle (implementada usando robot). Em seguida, a extremidade do controle deve primeiro receber a imagem transmitida pela extremidade controlada e refleti -la em um painel (painel), depois monitorar as ações do teclado e mouse na máquina e depois passar para o host da extremidade controlada (podemos fazê -lo definindo um ouvinte no painel)
Um problema encontrado aqui é que as imagens usadas para transmissão não podem ser serializadas se estão usando imagem ou bufferImage. Portanto, o I/Ostream não pode ser usado para transmissão. Portanto, para resolver esse problema, precisamos encapsular os dados da imagem em uma classe e implementar a classe de imagem de interface serializável da seguinte maneira:
importar java.io.file; importar java.io.fileInputStream; importar java.io.filenotfoundException; importar java.io.ioException; importar java.io.Serializable; mensagem de classe pública implementa serializável {private static stick long SerialVersionuid = 1l; nome do arquivo de string privado; // Nome do arquivo Private Long FilleLen Comprimento; // comprimento do arquivo Private Byte [] FileContent; // arquivo de conteúdo public message () {} public message (string filepath) lança ioexception {arquivo file = new File (filepath); this.FileLEngth = file.Length (); this.filename = file.getName (); FileInputStream fis = new FileInputStream (FilePath); byte [] bytes = novo byte [(int) comprimento do arquivo]; Fis.read (bytes, 0, (int) comprimento do arquivo); this.FileContent = bytes; } public string getFilename () {return filename;} public void setFilename (string filename) {this.fileName = filename;} public long getFileLength () {return fileLength; } public void setFileLength (comprimento do arquivo longo) {this.FileLength = fileLength;} public byte [] getFileContent () {return filecontent;} public void setFileContent (byte [] FileContent) {this.Filecontent = FileContent;}}}Isso permite que a imagem seja propagada através da serialização de objectInputStream e ObjectOutputStream
Depois de entender o básico acima, devemos primeiro concluir a configuração da interface da interface do usuário, a recepção da imagem e o monitoramento da ação do teclado e do mouse do lado do controle:
Primeiro, configure a imagem de recebimento:
public static void ReveiveSpic () lança 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 ()); BufferImage bi = imageio.read (fis); IiC = novo imageicon (BI); Imagem img = iiC.getImage (); Toolkit TK = Toolkit.getDefaultToolkit (); Dimensão d = tk.getScreensize (); int w = d.width; int h = d.Height; Bufedimage bi = redimensionamento (img, 800.600); image_lab.seticon (novo imageicon (BI)); img_lab.Repaint (); // Afaste o plano de fundo que desenhei antes de} REDIMENTO BUBLESIDO ESTÁTICO PRIVADO (IMG IMG, int neww, int newh) {int w = img.getwidth (null); int h = img.getheight (nulo); BufferImage dimg = new bufferImage (neww, newh, bufferiMage.type_int_bgr); Graphics2d g = dimg.creategraphics (); g.setRanderingHint (renderinghints.key_interpolation, renderinghints.value_interpolation_bilinear); G.Drawimage (IMG, 0, 0, Neww, Newh, 0, 0, W, H, Null); G.Dispose (); retornar DIMG; }Dessa forma, depois de receber a classe de mensagem do ObjectInputStream, a imagem pode ser redefinida para o tamanho do painel e exibida
O próximo passo é definir propriedades e ouvintes do painel:
public static void showui () {// título do console jframe jf = new jframe ("console"); setListener (JF); // tamanho do console jf.SetSize (500, 400); // Imag_lab é usado para armazenar a imagem imag_lab = new jlabel (); jf.add (imag_lab); // setVisible (true); // console top jf.SetalwaySontop (true); jf.setResizable (true); jf.setDefaultCloseoperation (jframe.exit_on_close); }Ouvinte:
public static void Setlistener (quadro jframe) {// Definir painel Definir o Listaner Frame.adDeyListener (new KeyAdapter () {public void KeyPressed (KeyEvent E) {sendEventObject (E);} @Override public void keyreLeardeEDED (KeyEVENT E) {sendEventOject (e); }); frame.addmousewheellistener (novo mouseweellistener () {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 mouseEntered (mouseevent e) {sendEventOngject (e);} public mousexited (mousevent e) {sendEverB {sendEventoBject (e); } private estático void sendEventoBject (Evento inputEvent) {try {System.out.println ("Send"); OOS.WriteObject (Evento); Oos.flush (); } catch (exceção ef) {ef.printStackTrace (); }O acima completa o final do controle.
Em seguida, construiremos o fim controlado:
A extremidade controlada precisa usar o robô para tirar capturas de tela e enviar, e é necessário escrever um método para reagir ao Inputevent recebido primeiro: as capturas de tela e envia:
public static void capturepic () lança awtexception, ioexception {robot = new robot (); Mensagem msg = null; 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 ++) {// intercepte a área da tela do retângulo de tamanho especificado Rec = novo retângulo (0, 0, (int) dm.getwidth (), (int) dm .getHeight ()); Bimage bufedimage = robot.createsCreencapture (rec); // Salve a imagem em um arquivo string filepath = "d: // out // screenShot"+i+".jpeg"; FileOutputStream FOPS = new FileOutputStream (FilePath); javax.imageio.imageio.write (bimage, "jpeg", fops); fops.flush (); fops.close (); msg = nova mensagem (filepath); System.out.println (msg.getFilename ()); System.out.println ("Send"); OOS.WriteObject (MSG); Oos.flush (); }}Observe que este código usa o diretório d:/ out/ como local de armazenamento para arquivos temporários. Os leitores precisam definir o armazenamento de documentos temporários sozinhos ao usar esse código.
Em seguida, implemente o robô para operar na instrução recebida no Inputevent:
public void Action () lança awtexception, classNotFoundException, IoException {robot robot = new Robot (); while (true) {inputevent e = (inputevent) ois.readObject (); if (e! = null) {handleEvents (robot, e);}}} public static void handlevents (ação robot, evento inputevent) {mouseevent mevent = null; // mouse event mousewheelevent mwevent = null; // evento de rolagem de mouse keyevent kevent = null; // evento de teclado int mouseButtonMask = -100; // switch de chave do mouse (event.getId ()) {case mouseevent.mouse_moved: // movy movy mevent = (mouseevent) event; Action.MousEmove (mevent.getx (), mevent.gety ()); quebrar ; case mouseevent.mouse_pressed: // mouse teclado pressione mevent = (mouseevent); Action.MousEmove (mevent.getx (), mevent.gety ()); mouseButtonMask = getMouseClick (mevent.getButton ()); if (mouseButtonMask! = -100) Action.mousePrime (mouseButtonMask); quebrar; case mouseevent.mouse_releded: // Libere o evento do botão do mouse mevent = (mouseevent); Action.MousEmove (mevent.getx (), mevent.gety ()); mouseButtonMask = getMouseClick (mevent.getButton ()); // Obtenha o botão do mouse se (mouseButtonMask! = -100) Action.MouseRelease (mouseButtonMask); quebrar ; case mouseevent.mouse_wheel: // mouse roll mwevent = (mousewheelevent) evento; action.mousewheel (mwevent.getwheelrotation ()); quebrar ; case mouseevent.mouse_dragged: // mouse drag mevent = (mouseevent); Action.MousEmove (mevent.getx (), mevent.gety ()); quebrar ; case keyevent.key_pressed: // key Kevent = (KeyEvent) Evento; ação.KeyPress (Kevent.getKeyCode ()); quebrar ; case keyevent.key_releded: // resolveu o evento Kevent = (KeyEvent); action.keyRelEase (Kevent.getKeyCode ()); quebrar ; Padrão: quebra; }} private static int getMouseClick (botão int) {// Obtenha o botão do mouse se (botão == mouseevent.button1) // tecla esquerda, a tecla do meio é botão de retorno inputevent.button1_mask; if (botão == mouseevent.button3) // chave direita retorna inputevent.button3_mask; retornar -100; }Todo o programa termina aqui. O programa acima não implementa encapsulamento de fios humanos robóticos. O código completo que pode ser usado pode ser baixado dos seguintes recursos do site: http://xiazai.vevb.com/201608/yuanma/java-romotecontrol(vevb.com).rar
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.