Java реализует технологию дистанционного управления
Сочетание java.net и java.awt.robot., Который поставляется с Java, может использоваться для реализации дистанционного управления другим компьютером по сети, включая управление движением удаленной компьютерной мыши и ввод клавиатуры и получение изображений удаленного компьютера в режиме реального времени. В этой статье будет использоваться краткий язык и логику от мелкого до глубокого, чтобы научить вас, как овладеть этой техникой.
Во -первых, давайте посмотрим на визуализации:
Удаленный компьютерный интерфейс:
Управляющий терминал компьютерный интерфейс:
Ввод терминала управления:
Отдаленный вход:
Давайте начнем с подробного введения технических идей пульта дистанционного управления.
Во -первых, два компьютера подключены через сокет java.net.
Сначала откройте Serversocket на одном конце, а затем подключитесь к другому концу с помощью гнезда.
Серверная сторона
Следует настроить Serversocket, и инициализируются требуемые потоки ввода и выходных данных:
public static void openserver () бросает ioException, classnotfoundexception {System.out.println ("ServerStart ......"); Serversocket Server = New Serversocket (7777); socket = server.accep (); System.out.println ("On Connection .../n"+сокет); OIS = new ObjectInputStream (socket.getInputStream ()); Oos = new objectOutputStream (socket.getOutputStream ()); }Клиентская сторона <br /> Сокет должен использоваться для подключения к серверу и инициализации потока ввода и вывода:
public static void startConnection (String ip, int port) бросает неизвестное хосткспение, ioException, awtexception {socket = new Socket ("192.168.0.106", 7777); if (socket.isconnected ()) {System.out.println ("Сокет подключен ..."+сокет); } Oos = new objectOutputStream (socket.getOutputStream ()); OIS = new ObjectInputStream (socket.getInputStream ()); }Таким образом, два компьютера связаны вместе, и данные могут обмениваться через потоки (InputStream и OutputStream).
Далее вы можете подумать о том, какую информацию нужно два компьютера для обмена на дистанционное управление? Во -первых, контролируемый конец должен непрерывно предоставить изображение экрана для контроля (это будет реализовано с использованием java.awt.robot), а затем мышь и клавиатура выполняют ту же операцию на основе события (зажигания), передаваемого концом управления (реализовано с помощью Robot). Затем конец управления должен сначала получить изображение, передаваемое контролируемым концом, и отразить его на панели (панель), затем отслеживать действия клавиатуры и мыши на машине, а затем передать его на хост контролируемого конца (мы можем сделать это, установив слушатель на панели панели)
Одна проблема, возникающая здесь, заключается в том, что изображения, используемые для передачи, не могут быть сериализованы, используют ли они Image или BuffereMage. Поэтому I/Ostream не может быть использован для передачи. Поэтому, чтобы решить эту проблему, нам нужно инкапсулировать данные изображения в класс и реализует сериализуемый класс изображения интерфейса следующим образом:
Импорт java.io.file; import java.io.fileinputstream; import java.io.filenotfoundexception; импорт java.io.ioexception; импорт java.io.serializable; Общедоступное сообщение реализует сериализуемые {частное статическое окончательное long serialversionionuid = 1L; частное имя файла; // Имя файла частная длинная длина; // Длина файла Private Byte [] FileContent; // Содержимое файла public message () {} public message (String filePath) Throws ioException {file file = new File (filePath); this.fileLength = file.length (); this.filename = file.getName (); FileInputStream fis = new FileInputStream (filePath); Byte [] Bytes = новый байт [(int) fileLength]; Fis.read (байты, 0, (int) filelength); this.filecontent = байты; } public String getFilEname () {return filename;} public void setFilEname (String filename) {this.filename = filename;} public long getFileLength () {return fileLength; } public void setFileLength (long fileLength) {this.fileLength = fileLength;} public byte [] getFileContent () {return fileContent;} public void setFileContent (byte [] fileContent) {this.filecontent = fileContent;}}Это позволяет распространять изображение посредством сериализации ObjectInputStream и ObjectOutputStream
После понимания вышеуказанных оснований мы должны сначала завершить настройку интерфейса пользовательского интерфейса, прием изображения, а также мониторинг действий с клавиатурой и мыши на стороне управления:
Во -первых, настройте получение получения изображения:
public static void reveivepic () бросает classnotfoundexception, ioException {message g = (сообщение) 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 = новый ImageICon (BI); Image img = iic.getimage (); Toolkit tk = toolkit.getDefaulttoolkit (); Размер d = tk.getScreensize (); int w = d.width; int H = D.Height; BufferedImage bi = resrize (IMG, 800 600); image_lab.seticon (new imageicon (bi)); img_lab.repaint (); // Пантируйте фон, который я нарисовал до} private static bufferemage resize (image img, int neww, int newh) {int w = img.getwidth (null); int h = img.getheight (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.dispose (); вернуть Dimg; }Таким образом, после получения класса сообщений от ObjectInputStream изображение можно сбросить до размера панели и отобразить
Следующим шагом является установка свойств и слушателей панели:
public static void showui () {// титул консоли jframe jf = new jframe ("console"); SetListener (JF); // размер консоли JF.SetSize (500, 400); // IMAC_LAB используется для хранения изображения IMAC_LAB = new jlabel (); jf.add (imag_lab); // setVisible (true); // Консоль Top jf.setalwaysontop (true); jf.setReSizable (true); jf.setDefaultCloseoPeration (jframe.exit_on_close); }Слушатель:
public static void setListener (jframe frame) {// панель набор прослушивателей frame.addkeylistener (new KeyAdapter () {public void Keypressed (KeyEvent e) {sendEventObject (e);} @Override public void keyReledElued (KeyEvent e) {sendEventObject (e);} @Override publiceed (keyEvent e) {sendeventObject (e);} @Override publiceed (keyEvent e) {sendEventObject (E); frame.addmousewheellistener (new MouseWheellistener () {public void MouseWheelmoved (MouseWeeLevent 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 mouseEnted (mouseevent e) {sendeventObject (e);} public void mouseexited (mousevent e) {sendeventobject (e); e) {SendEventObject (e); } private static void sendeventObject (inputevent Event) {try {System.out.println ("Send"); OOS.WriteObject (событие); Oos.flush (); } catch (Exception ef) {ef.printstackTrace (); }Вышеуказанное завершает конец управления.
Далее мы построим контролируемый конец:
Контролируемый конец должен использовать робота для съемки экрана и отправки, и необходимо сначала написать метод для отреагирования на полученные напротив: снимки экрана и отправки:
public static void captuePic () бросает awtexception, ioException {robot = new Robot (); Сообщение msg = null; Toolkit tk = java.awt.toolkit.getDefaulttoolkit (); java.awt.dimension dm = tk.getScreensize (); java.awt.robot robot = new java.awt.robot (); для (int i = 0; i <50; i ++) {// перехватить область экрана указанного размера прямоугольник rec = new Rectangle (0, 0, (int) dm.getwidth (), (int) dm .getheight ()); BufferedImage bimage = robot.createscreencapture (rec); // Сохранить изображение в файл string filePath = "d: // out // scenshot"+i+".jpeg"; FileOutputStream FOPS = new FileOutputStream (filePath); javax.imageio.imageio.write (bimage, "jpeg", fops); fops.flush (); fops.close (); msg = новое сообщение (FilePath); System.out.println (msg.getFilename ()); System.out.println ("Send"); OOS.WriteObject (MSG); Oos.flush (); }}Обратите внимание, что этот код использует каталог d:/ out/ out/ место хранилища для временных файлов. Читатели должны самостоятельно установить хранилище временных документов при использовании этого кода.
Затем реализуйте робота для работы в полученной инструкции по задержанию:
public void action () бросает awtexception, classnotfoundexception, ioexception {robot robot = new Robot (); while (true) {inputevent e = (inputevent) ois.readobject (); if (e! = null) {harderevents (robot, e);}}} public static void handleevents (octe robot, событие InpuTevent) {mouseVent mevent = null; // событие мыши MouseWheElevent mwevent = null; // keevent события прокрутки мыши keevent kevent = null; // Клавиатура события int mousebuttonmask = -100; // переключатель ключей мыши (event.getId ()) {case mouseevent.mouse_moved: // mouse moves mevent = (mouseevent) event; action.mousemove (mevent.getx (), mevent.gety ()); перерыв ; case mouseevent.mouse_pressed: // Клавиша мыши нажмите mevent = (mouseevent) событие; action.mousemove (mevent.getx (), mevent.gety ()); MouseButtonMask = getMouseClick (mevent.getButton ()); if (mousebuttonmask! = -100) action.mousepress (mousebuttonmask); перерыв; case mouseevent.mouse_releaded: // Отпустите событие кнопки мыши mevent = (mouseevent); action.mousemove (mevent.getx (), mevent.gety ()); MouseButtonMask = getMouseClick (mevent.getButton ()); // Получить кнопку мыши if (mousebuttonmask! = -100) action.mouserelease (Mousebuttonmask); перерыв ; case mouseevent.mouse_wheel: // mouse scroll mwevent = (mouseweelevent); action.mousewheel (mwevent.getwheelrotation ()); перерыв ; case mouseevent.mouse_dragged: // mouse drag mevent = (mouseevent) событие; action.mousemove (mevent.getx (), mevent.gety ()); перерыв ; case keyevent.key_pressed: // key kevent = (keyevent) событие; action.keypress (kevent.getKeyCode ()); перерыв ; case keyEvent.key_relead: // Решенное ключ kevent = (keyEvent) событие; action.keyrelease (kevent.getKeyCode ()); перерыв ; по умолчанию: перерыв; }} private static int getmouseclick (int button) {// Получить кнопку мыши if (кнопка == mouseevent.button1) // Левая клавиша, средняя клавиша - кнопка 2 возвращать inputevent.button1_mask; if (button == mouseevent.button3) // правый ключ вернуть inputevent.button3_mask; возврат -100; }Вся программа заканчивается здесь. Приведенная выше программа не внедряет инкапсуляцию роботизированных человеческих нитей. Полный код, который можно использовать, можно загрузить из следующих ресурсов сайта: http://xiazai.vevb.com/201608/yuanma/java-romotecontrol(vevb.com).rar
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.