Java ใช้เทคโนโลยีการควบคุมระยะไกล
การผสมผสานของ java.net และ java.awt.robot. ซึ่งมาพร้อมกับ Java สามารถใช้เพื่อรับรู้การควบคุมระยะไกลของคอมพิวเตอร์เครื่องอื่นผ่านเครือข่ายรวมถึงการควบคุมการเคลื่อนไหวของเมาส์คอมพิวเตอร์ระยะไกลและอินพุตของคีย์บอร์ด บทความนี้จะใช้ภาษาและตรรกะที่กระชับจากตื้นจนถึงลึกเพื่อสอนวิธีการฝึกเทคนิคนี้
ก่อนอื่นมาดูการเรนเดอร์:
อินเทอร์เฟซคอมพิวเตอร์ระยะไกล:
การควบคุมเทอร์มินัลคอมพิวเตอร์อินเทอร์เฟซ:
อินพุตเทอร์มินัลควบคุม:
อินพุตระยะไกล:
เริ่มต้นด้วยการแนะนำอย่างละเอียดเกี่ยวกับแนวคิดทางเทคนิคของการควบคุมระยะไกล
ก่อนอื่นคอมพิวเตอร์สองเครื่องจะเชื่อมต่อผ่านซ็อกเก็ตของ java.net
ก่อนอื่นเปิดเซิร์ฟเวอร์ที่ปลายด้านหนึ่งจากนั้นเชื่อมต่อกับปลายอีกด้านด้วยซ็อกเก็ต
ด้านเซิร์ฟเวอร์
ควรตั้งค่าเซิร์ฟเวอร์และสตรีมอินพุตและเอาต์พุตที่จำเป็นต้องเริ่มต้น:
โมฆะคงที่สาธารณะ openserver () พ่น IOException, classnotFoundException {system.out.println ("serverstart ...... "); Serversocket Server = ใหม่ Serversocket (7777); ซ็อกเก็ต = server.accept (); System.out.println ("ในการเชื่อมต่อ .../n"+ซ็อกเก็ต); ois = ใหม่ ObjectInputStream (socket.getInputStream ()); OOS = ใหม่ ObjectOutputStream (socket.getOutputStream ()); -ฝั่งไคลเอ็นต์ <br /> ซ็อกเก็ตควรใช้เพื่อเชื่อมต่อกับเซิร์ฟเวอร์และเริ่มต้นสตรีมอินพุตและเอาต์พุต:
โมฆะคงที่สาธารณะ startConnection (สตริง IP, พอร์ต int) โยน UnknownHostException, IOException, Awtexception {ซ็อกเก็ต = ซ็อกเก็ตใหม่ ("192.168.0.106", 7777); if (socket.isconnected ()) {system.out.println ("เชื่อมต่อซ็อกเก็ต ... "+ซ็อกเก็ต); } oos = new ObjectOutputStream (socket.getOutputStream ()); ois = ใหม่ ObjectInputStream (socket.getInputStream ()); -ด้วยวิธีนี้คอมพิวเตอร์สองเครื่องจะเชื่อมโยงเข้าด้วยกันและสามารถแลกเปลี่ยนข้อมูลผ่านสตรีม (InputStream และ OutputStream)
ถัดไปคุณสามารถคิดเกี่ยวกับข้อมูลใดที่คอมพิวเตอร์สองเครื่องต้องแลกเปลี่ยนสำหรับการควบคุมระยะไกล? ขั้นแรกปลายทางควบคุมจะต้องให้ภาพหน้าจออย่างต่อเนื่องไปยังปลายควบคุม (จะถูกนำไปใช้โดยใช้ java.awt.robot) จากนั้นเมาส์และคีย์บอร์ดจะทำการดำเนินการเดียวกันตามเหตุการณ์ (inputevent) ที่ส่งโดยปลายควบคุม (นำไปใช้โดยใช้หุ่นยนต์) จากนั้นปลายการควบคุมจะต้องได้รับภาพที่ส่งโดยปลายควบคุมและสะท้อนมันบนแผง (บานหน้าต่าง) จากนั้นตรวจสอบการกระทำของแป้นพิมพ์และเมาส์บนเครื่องแล้วส่งไปยังโฮสต์ของปลายควบคุม (เราสามารถทำได้โดยการตั้งค่าฟังบนบานหน้าต่างแผง)
ปัญหาหนึ่งที่พบในที่นี้คือภาพที่ใช้สำหรับการส่งสัญญาณไม่สามารถทำให้เป็นอนุกรมไม่ว่าจะใช้ภาพหรือบัฟเฟอร์ ดังนั้น I/Ostream ไม่สามารถใช้สำหรับการส่ง ดังนั้นเพื่อแก้ปัญหานี้เราจำเป็นต้องห่อหุ้มข้อมูลภาพในชั้นเรียนและใช้คลาสอินเตอร์เฟสภาพอนุกรมดังต่อไปนี้:
นำเข้า java.io.file; นำเข้า java.io.fileinputstream; นำเข้า java.io.filenotfoundexception; นำเข้า java.io.ioexception; นำเข้า Java.io.serializable; ชื่อไฟล์สตริงส่วนตัว; // ชื่อไฟล์ความยาวคลื่นส่วนตัวยาว; // ความยาวไฟล์ไบต์ส่วนตัว [] fileContent; // ไฟล์ไฟล์ข้อความสาธารณะ () {} ข้อความสาธารณะ (สตริง filePath) พ่น IOException {ไฟล์ไฟล์ = ไฟล์ใหม่ (filePath); this.fileLength = file.length (); this.filename = file.getName (); FileInputStream FIS = ใหม่ FileInputStream (FilePath); ไบต์ [] ไบต์ = ไบต์ใหม่ [(int) filelength]; fis.read (ไบต์, 0, (int) filelength); this.fileContent = bytes; } public String getFilename () {return filename;} โมฆะสาธารณะ setFileName (ชื่อไฟล์สตริง) {this.filename = filename;} public long long getFileLength () {return filelength; } โมฆะสาธารณะ setFileLength (ยาว filelength) {this.filelength = filelength;} byte สาธารณะ [] getFileContent () {return fileContent;} โมฆะสาธารณะ setFileContent (byte [] fileContent) {this.filecontent = filecontent;สิ่งนี้ช่วยให้ภาพเผยแพร่ผ่านการทำให้เป็นอนุกรมของ ObjectInputStream และ ObjectOutputStream
หลังจากทำความเข้าใจพื้นฐานด้านบนเราต้องทำการตั้งค่าอินเตอร์เฟส UI ก่อนการรับภาพและการตรวจสอบการดำเนินการของคีย์บอร์ดและเมาส์ของด้านการควบคุม:
ก่อนอื่นตั้งค่ารูปภาพที่ได้รับ:
โมฆะสาธารณะคงที่ reveivePic () พ่น classnotfoundexception, ioexception {ข้อความ g = (ข้อความ) ois.readobject (); fileOutputStream fos = ใหม่ fileOutputStream ("d: // out //"+g.getFilename ()); fos.write (g.getFileContent (), 0, (int) g.getFileLength ()); fos.flush (); FileInputStream FIS = ใหม่ 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 = Resize (IMG, 800,600); image_lab.seticon (imageicon ใหม่ (bi)); img_lab.repaint (); // pind ออกไปเบื้องหลังฉันดึงก่อน} bufferedimage ส่วนตัวปรับขนาด (ภาพ 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 รูปภาพสามารถรีเซ็ตเป็นขนาดของบานหน้าต่างพาเนลและแสดง
ขั้นตอนต่อไปคือการตั้งค่าคุณสมบัติและผู้ฟัง:
โมฆะคงที่สาธารณะ showui () {// ชื่อคอนโซล jframe jf = new JFrame ("คอนโซล"); Setlistener (JF); // ขนาดคอนโซล jf.setsize (500, 400); // imag_lab ใช้เพื่อเก็บรูปภาพ imag_lab = new jlabel (); jf.add (Imag_lab); // setVisible (จริง); // คอนโซลด้านบน jf.setalwaysontop (จริง); jf.setResizable (จริง); jf.setDefaultCloseOperation (jframe.exit_on_close); -ผู้ฟัง:
โมฆะคงที่สาธารณะ setListener (กรอบ JFrame) {// ชุดแผงฟังเฟรม AddKeyListener (keyadapter ใหม่ () {โมฆะสาธารณะ keypressed (KeyEvent E) {SendEventObject (e);} @Override Void Public Void - frame.addmousewheellistener (ใหม่ Mousewheellistener () {โมฆะสาธารณะ Mousewheelmoved (Mousewheelevent E) {SendEventObject (E);}}); frame.addmousemotionListener (ใหม่ mousemotionListener () {โมฆะสาธารณะ mousedragged (MouseEvent E) {SendEventObject (e);} โมฆะสาธารณะ mousemoved (MouseEvent e) {SendEventObject (e);}}); frame.addmouselistener (mouselistener ใหม่ () {โมฆะสาธารณะ mouseclicked (MouseEvent E) {SendEventObject (e);} โมฆะสาธารณะ mouseentered (MouseEvent e) {SendEventObject (e); Mousepressed (MouseEvent E) {SendEventObject (E); } โมฆะคงที่ส่วนตัว SendEventObject (เหตุการณ์อินพุต) {ลอง {system.out.println ("ส่ง"); oos.writeObject (เหตุการณ์); oos.flush (); } catch (Exception ef) {ef.printStackTrace (); -ข้างต้นเสร็จสิ้นการควบคุม
ต่อไปเราจะ สร้างจุดสิ้นสุดที่ควบคุม:
ปลายที่ควบคุมจะต้องใช้หุ่นยนต์เพื่อถ่ายภาพหน้าจอและส่งและจำเป็นต้องเขียนวิธีการตอบสนองต่อ inputeVent ที่ได้รับก่อน: ภาพหน้าจอและส่ง:
โมฆะสาธารณะคงที่ capturepic () พ่น Awtexception, ioException {Robot = ใหม่ Robot (); ข้อความข้อความ = 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 = สี่เหลี่ยมใหม่ (0, 0, (int) dm.getWidth (), (int) dm. -getheight ()); bufferedImage bimage = Robot.createscreencapture (REC); // บันทึกภาพไปยังสตริงไฟล์ filePath = "d: // out // screenshot"+i+".jpeg"; FileOutputStream FOPS = ใหม่ fileOutputStream (filePath); javax.imageio.imageio.write (bimage, "jpeg", fops); fops.flush (); fops.close (); msg = ข้อความใหม่ (filepath); System.out.println (msg.getfilename ()); System.out.println ("ส่ง"); oos.writeObject (msg); oos.flush (); -โปรดทราบว่ารหัสนี้ใช้ D:/ Out/ Directory เป็นสถานที่จัดเก็บข้อมูลสำหรับไฟล์ชั่วคราว ผู้อ่านจำเป็นต้องตั้งค่าการจัดเก็บเอกสารชั่วคราวด้วยตนเองเมื่อใช้รหัสนี้
จากนั้นใช้หุ่นยนต์เพื่อใช้งานกับคำสั่ง InputeVent ที่ได้รับ:
การกระทำของโมฆะสาธารณะ () พ่น Awtexception, classnotfoundexception, ioexception {หุ่นยนต์หุ่นยนต์ = ใหม่หุ่นยนต์ (); ในขณะที่ (จริง) {inputeVent e = (inputeVent) ois.readObject (); if (e! = null) {handlevents (Robot, e);}}} void handlevents แบบคงที่สาธารณะ (การกระทำของหุ่นยนต์, เหตุการณ์อินพุต) {MouseEvent MEVENT = NULL; // เหตุการณ์เมาส์ Mousewheelevent mwevent = null; // mouse scroll event event keyevent kevent = null; // คีย์บอร์ดเหตุการณ์ int mouseButtonmask = -100; // สวิตช์คีย์เมาส์ (event.getId ()) {case mouseEvent.mouse_moved: // การเคลื่อนไหวของเมาส์ meVent = (MouseEvent) เหตุการณ์; 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_released: // ปล่อยปุ่มเมาส์ meVent = (MouseEvent) เหตุการณ์; action.mousemove (mevent.getx (), mevent.gety ()); MouseButtonMask = getMouseClick (meVent.getButton ()); // รับปุ่มเมาส์ถ้า (MouseButtonMask! = -100) Action.MouserElease (MouseButtonMask); หยุดพัก ; Case MouseEvent.mouse_wheel: // Mouse Scroll mwevent = (Mousewheelevent) เหตุการณ์; Action.Mousewheel (mwevent.getWheelrotation ()); หยุดพัก ; Case MouseEvent.mouse_dragged: // การลากเมาส์ MEVENT = (MouseEvent) เหตุการณ์; action.mousemove (mevent.getx (), mevent.gety ()); หยุดพัก ; Case KeyEvent.KEY_PRESSED: // คีย์ KEVENT = (KeyEvent) เหตุการณ์; action.keypress (kevent.getkeycode ()); หยุดพัก ; Case KeyEvent.KEY_RELEASED: // คีย์ที่แก้ไขแล้ว KEVENT = (KEYEVENT) เหตุการณ์; action.keyrelease (kevent.getkeycode ()); หยุดพัก ; ค่าเริ่มต้น: break; }} ส่วนตัวคงที่ int getMouseClick (ปุ่ม int) {// รับปุ่มเมาส์ถ้า (ปุ่ม == MouseEvent.button1) // คีย์ซ้ายปุ่มกลางคือปุ่มกลับกลับ if (button == MouseEvent.button3) // คีย์ Right Return INPUTEVENT.BUTTON3_MASK; กลับมา -100; -โปรแกรมทั้งหมดสิ้นสุดที่นี่ โปรแกรมข้างต้นไม่ได้ใช้การห่อหุ้มของหัวข้อมนุษย์หุ่นยนต์ รหัสที่สมบูรณ์ที่สามารถใช้งานได้สามารถดาวน์โหลดได้จากแหล่งข้อมูลเว็บไซต์ต่อไปนี้: http://xiazai.vevb.com/201608/yuanma/java-romotecontrol(vevb.com).rar
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น