รหัสอินสแตนซ์ Java เพื่อใช้เดสก์ท็อประยะไกล
ด้านการควบคุมผ่านเหตุการณ์เมาส์ไปยังฝั่งเซิร์ฟเวอร์
หลังจากได้รับเหตุการณ์เมาส์บนเซิร์ฟเวอร์แล้วจะส่งไปยังไคลเอนต์
หลังจากที่ลูกค้าได้รับเหตุการณ์เมาส์แล้วจะเสร็จสิ้นผ่านคลาสหุ่นยนต์และภาพหน้าจอจะถูกนำไปส่งภาพไปยังเซิร์ฟเวอร์และเซิร์ฟเวอร์จะส่งไปยังเทอร์มินัลควบคุม
หลังจากที่ฉันทำให้มันง่ายขึ้น
// ก่อนแนะนำการใช้งานง่าย ๆ ของคลาสหุ่นยนต์นำเข้า java.awt.awtexception; นำเข้า java.awt.robot; นำเข้า java.awt.event.inputEvent;/** * ใช้หุ่นยนต์ * @author dumb * */Robot Robot {public Robot) R.Mousemove (300, 500); // เมาส์ย้าย r.mousepress (inputeVent.Button1_Mask); // เมาส์กด r.mouserelease (inputeVent.button1_mask); // เมาส์ปล่อย r.keypress ((int) 'a'); // Makeboard Press (int) 'A' หมายถึงการแปลงเป็นคีย์ที่สอดคล้องกันของแป้นพิมพ์ r.keylease ((int) 'a'); // makeboard release}} // การรวบรวมข้อมูลหน้าจอนำเข้า java.awt.awtexception; นำเข้า java.awt.rectangle; นำเข้า java.awt.robot; นำเข้า java.awt.image.bufferedimage; นำเข้า javax.swing.imageicon; javax.swing.windowconstants;/*** คลานรูปภาพเดสก์ท็อปท้องถิ่น* @author dumb**/คลาสสาธารณะ screentest {โมฆะคงที่สาธารณะหลัก (สตริง [] args) โยน awtexception, interruptedexception {หุ่นยนต์หุ่นยนต์ = หุ่นยนต์ใหม่ (); JFrame JFrame = new JFrame (); jframe.setsize (1200, 700); ฉลาก jlabel = new jlabel (); jframe.add (ฉลาก); // สี่พารามิเตอร์ xy ความสูงความสูง jframe.setVisible (จริง); jframe.setDefaultCloseOperation (WindowConstants.exit_on_close); // สร้างการสกัดกั้นแบบไดนามิกที่ตายแล้วในขณะที่ (จริง) {bufferedImage image = robot.createscreencapture (สี่เหลี่ยมผืนผ้าใหม่ (0,0,1366,768)); // seave ฉลากหน้าจอ Seticon (ภาพใหม่ (ภาพ)); Thread.sleep (50); - // คำอธิบายเกี่ยวกับหลักการของการควบคุมระยะไกล
// แบ่งออกเป็นปลายเซิร์ฟเวอร์และสิ้นสุดไคลเอนต์
// ในขั้นต้นฝั่งเซิร์ฟเวอร์จะใช้เป็นเพียงการส่งต่อเท่านั้น แต่ไม่ได้เขียนการส่งต่อเป็นการสาธิต
// นั่นคือฝั่งไคลเอ็นต์ควบคุมฝั่งเซิร์ฟเวอร์ e
-
* สิ่งที่ฉันใช้ที่นี่คือการส่งเหตุการณ์เมาส์ทางฝั่งไคลเอ็นต์นั่นคือด้านการควบคุมหลังจากได้รับหน้าจอที่ส่งโดยฝั่งเซิร์ฟเวอร์
* จากนั้นใช้หุ่นยนต์เพื่อประมวลผล
* วิธีการส่งสามารถประมวลผลด้วยซ็อกเก็ต+io
* การจับภาพหน้าจอและการบีบอัดภาพใช้ฟังก์ชั่นการจับภาพหน้าจอของหุ่นยนต์และตัวเข้ารหัสรูปภาพของ JDK เพื่อแปลงเป็นอาร์เรย์ไบต์
* หลังจากส่งไปยังเซิร์ฟเวอร์หุ่นยนต์สามารถรับวัตถุวัตถุโดยตรงผ่านซ็อกเก็ต IO+และโยนลงใน InputEvent (ทั้ง KeyEvent และ MouseEvent ได้รับการสืบทอด)
* โดยการตัดสินประเภทเหตุการณ์คุณสามารถประมวลผลแยกต่างหาก ที่นี่จำเป็นต้องใช้สองเธรดบนเซิร์ฟเวอร์หนึ่งคือการคัดกรองและส่งไปยังไคลเอนต์และอีกเธรดคือการฟังไคลเอนต์
* ผ่านเหตุการณ์
-
// ต่อไปนี้เป็นรหัสการใช้งานเฉพาะ
// กระบวนการหลักของเซิร์ฟเวอร์นำเข้า java.awt.awtexception; นำเข้า java.awt.event; นำเข้า java.awt.robot; นำเข้า java.awt.event.inputevent; นำเข้า java.awt.event.keyevent; นำเข้า Java.avent. java.io.ObjectInputStream; นำเข้า java.net.serversocket; นำเข้า java.net.socket;/*** เซิร์ฟเวอร์* @author dumb**/เซิร์ฟเวอร์ระดับสาธารณะ System.out.println ("เซิร์ฟเวอร์เริ่มต้นตามปกติ"); ซ็อกเก็ตซ็อกเก็ต = Server.accept (); // กำลังรอรับคำขอปิดกั้นวิธีการ System.out.println ("มีการเชื่อมต่อไคลเอนต์"); DataOrtputStream DOS = ใหม่ dataOutputStream (socket.get.getOutputStream ()); // ถ่ายโอนสตรีมเอาต์พุตที่เชื่อมโยงโดยไคลเอนต์และฝั่งเซิร์ฟเวอร์การประมวลผล imagethread imagethread = ใหม่ imagethread (dos); เธรดใหม่ (imagethread). start (); เธรดใหม่ (ใหม่ EventThread (ใหม่ ObjectInputStream (socket.getInputStream ()))). start (); }}/*** ใช้ในการจัดการเหตุการณ์เมาส์ที่ได้รับหรือเหตุการณ์แป้นพิมพ์*/คลาส EventThread ดำเนินการ undernable {private ObjectInputStream OIS; หุ่นยนต์หุ่นยนต์ส่วนตัว Public EventThread (ObjectInputStream ois) {this.ois = ois; } @Override โมฆะสาธารณะ Run () {ลอง {Robot = ใหม่ Robot (); ในขณะที่ (จริง) {เหตุการณ์อินพุทอีเวนต์ = (อินพุต) ois.readObject (); // นำเข้าวัตถุที่วัตถุที่ส่งโดยไคลเอนต์เป็น Object ActionEvent (เหตุการณ์); // จัดการเหตุการณ์}} catch (awtexception e) {e.printstacktrace (); } catch (classnotFoundException e) {e.printStackTrace (); } catch (ioexception e) {e.printstacktrace (); } ในที่สุด {ลอง {ois.close (); } catch (ioexception e) {e.printstacktrace (); }}} / *** การประมวลผลเหตุการณ์ใช้เพื่อตัดสินประเภทเหตุการณ์และดำเนินการกับคลาสหุ่นยนต์* @param Event* / Public Void ActionEvent (เหตุการณ์อินพุต) {System.out.println (เหตุการณ์); if (เหตุการณ์อินสแตนซ์ของ KeyEvent) {KeyEvent E = (KeyEvent) เหตุการณ์; int type = e.getId (); // รับประเภทเหตุการณ์ถ้า (type == event.key_press) {robot.keypress (e.getkeycode ()); } อื่นถ้า (type == event.key_release) {robot.keyrelease (e.getKeyCode ()); }} อื่นถ้า (เหตุการณ์อินสแตนซ์ของ MouseEvent) {MouseEvent E = (MouseEvent) เหตุการณ์; int type = e.getId (); if (type == event.mouse_move) {Robot.mousemove (e.getx (), e.gety ()); } อื่นถ้า (type == event.mouse_down) {Robot.mousepress (getMouseKey (type)); } อื่นถ้า (type == event.mouse_up) {Robot.mouserelease (getMouseKey (type)); } อื่นถ้า (type == event.mouse_drag) {robot.mousemove (e.getx (), e.gety ()); // การลากเมาส์}}}}/*** ส่งคืนเหตุการณ์จริงของเมาส์ เวลาของเมาส์ไม่สามารถประมวลผลได้โดยตรงและจำเป็นต้องได้รับการแปลง * @return */public int getMouseKey (ปุ่ม int) {ถ้า (ปุ่ม == MouseEvent.Button1) {// ปุ่มซ้ายของเมาส์ส่งคืน pututeVent.button1_mask; } อื่นถ้า (ปุ่ม == MouseEvent.Button2) {// ปุ่มขวาของเมาส์ส่งคืน inputeVent.Button2_Mask; } อื่นถ้า (ปุ่ม == MouseEvent.Button3) {// Scroller return inputeVent.Button3_Mask; } else {return 0; }}} // หน้าจอและผู้ส่งที่นี่คุณต้องได้รับการนำเข้ากระแสของซ็อกเก็ต java.awt.awtexception; นำเข้า java.awt.dimension; นำเข้า java.awt.rectangle นำเข้า Java.awt.Robot; นำเข้า Java.Awt.Toolkit; java.io.ByTeArrayOutputStream; นำเข้า java.io.dataOutputStream; นำเข้า java.io.ioexception; นำเข้า com.sun.image.codec.jpeg.*;/*** ใช้เพื่อส่งข้อมูลภาพ* @author dumb*/คลาสสาธารณะ // data output imagethread สาธารณะ (dataOutputStream dos) {this.dos = dos; } @Override โมฆะสาธารณะเรียกใช้ () {ลอง {หุ่นยนต์หุ่นยนต์ = ใหม่หุ่นยนต์ (); // seave มิติมิติหน้าจอทั้งหมด = toolkit.getDefaultToolKit (). getScreensize (); /* int width = (int) dimensional.getWidth (); ความสูง int = (int) dimensional.getWidth (); สี่เหลี่ยมผืนผ้า rec = สี่เหลี่ยมใหม่ (0,0 ความกว้างความสูง); */ สี่เหลี่ยมผืนผ้า rec = สี่เหลี่ยมใหม่ (มิติ); BufferedImage Image; Byte ImageBytes []; ในขณะที่ (จริง) {image = robot.createscreencapture (rec); ImageBytes = getImageBytes (รูปภาพ); dos.writeint (imagebytes.length); dos.write (ImageBytes); dos.flush (); Thread.sleep (50); // Thread Sleep}} catch (awtexception e) {e.printstacktrace (); } catch (imageformatexception e) {e.printstacktrace (); } catch (ioexception e) {e.printstacktrace (); } catch (interruptedException e) {e.printStackTrace (); } ในที่สุด {ลอง {ถ้า (dos! = null) dos.close (); } catch (ioexception e) {e.printstacktrace (); }}} / *** รูปภาพบีบอัด* รูปภาพ @param ที่ต้องบีบอัด* @return บีบอัดอาร์เรย์ไบต์* @throws ioexception* @throws imageformatexception* / byte public [] getImageBytes (bufferedImage image) // บีบอัดคอมเพรสเซอร์และจัดเก็บไว้ก่อนในสตรีมเอาต์พุตไบต์ jpeGimageEncoder jpegd = jpegCodec.createJpeGenCoder (BAOS); // บีบอัด IAMGE JPEGD.ENCODE (รูปภาพ); // แปลงเป็น byte array return baos.tobytearray (); - - java.io.ObjectOutputStream; นำเข้า java.net.socket; นำเข้า java.net.unknownhostexception; นำเข้า javax.swing.imageicon; นำเข้า Javax.swing.jframe; นำเข้า Javax.swing.jlabel; javax.swing.windowconstants;/*** ไคลเอนต์* @author dumb**/ไคลเอนต์คลาสสาธารณะ {โมฆะสาธารณะคงที่หลัก (สตริง args []) โยน unknownhostexception, ioexception {ซ็อกเก็ต s = ซ็อกเก็ตใหม่ ("127.0.0.1", 80); datainputStream dis = new datainputStream (s.getInputStream ()); ObjectOutputStream OOS = ใหม่ ObjectOutputStream (S.GetOutputStream ()); ClientWindow CW = ใหม่ ClientWindow (OOS); ไบต์ [] ImageBytes; ในขณะที่ (จริง) {imageBytes = byte ใหม่ [dis.readint ()]; // ก่อนอื่นรับความยาวอาร์เรย์ที่ผ่านมาอย่างอ่านได้ดี (imageBytes); // จัดเก็บข้อมูลทั้งหมดใน BYTE CW.RepainImage (ImageBytes); }}}/*** ฟอร์มไคลเอนต์* @author dumb**/คลาส clientWindow ขยาย jframe {private objectOutputStream oos; ฉลาก Jlabel ส่วนตัว; // การเขียนพื้นหลังใหม่วิธีภาพโมฆะสาธารณะ repainimage (byte [] imageBytes) {label.seticon (imageicon ใหม่ (ImageBytes)); this.repaint (); } Public ClientWindow (ObjectOutputStream oos) {this.oos = oos; this.settitle ("โปรแกรมควบคุมระยะไกล"); label = new jlabel (); JPanel P = new JPanel (); p.add (ฉลาก); JScrollpane Scroll = new JScrollpane (P); // เพิ่มแถบเลื่อนลงในแผง P this.add (Scroll); this.setsize (1024,768); this.setDefaultCloseOperation (WindowConstants.exit_on_close); this.setVisible (จริง); this.addkeyListener (keyListener ใหม่ () {@Override โมฆะสาธารณะ keyTyped (KeyEvent E) {// todo วิธีการที่สร้างอัตโนมัติ auto} @Override โมฆะสาธารณะคีย์รีด (keyEvent e) {sendEvent (e); label.addmouselistener (mouselistener ใหม่ () {@Override โมฆะสาธารณะ mouserleased (MouseEvent e) {SendEvent (e);} @Override โมฆะสาธารณะ mousepressed (MouseEvent e) {sendEvent (e); เป็นโมฆะ Mouseentered (MouseEvent E) {// TODO วิธีการสร้างอัตโนมัติ stub} @Override โมฆะสาธารณะ mousexited (MouseEvent E) {// วิธีการที่สร้างอัตโนมัติ todo stub}}); } โมฆะสาธารณะ SendEvent (เหตุการณ์อินพุต) {ลอง {oos.writeObject (เหตุการณ์); } catch (ioexception e) {e.printstacktrace (); -รหัสตัวอย่างข้างต้นสำหรับการใช้งาน Java ของเดสก์ท็อประยะไกลเป็นเนื้อหาทั้งหมดที่ฉันได้แชร์กับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น