Java تنفذ تقنية التحكم عن بُعد
يمكن استخدام مزيج من java.net و java.awt.robot. ، والذي يأتي مع Java ، لتحقيق التحكم عن بُعد لجهاز كمبيوتر آخر على الشبكة ، بما في ذلك التحكم في حركة ماوس الكمبيوتر عن بُعد وإدخال لوحة المفاتيح ، والحصول على صور لشاشة الكمبيوتر البعيدة في الوقت الفعلي. ستستخدم هذه المقالة لغة ومنطق موجز من الضحلة إلى العمق لتعليمك كيفية إتقان هذه التقنية.
أولاً ، دعونا نلقي نظرة على الاداءات:
واجهة الكمبيوتر عن بعد:
التحكم في واجهة الكمبيوتر الطرفية:
إدخال محطة التحكم:
الإدخال البعيد:
لنبدأ بالمقدمة التفصيلية للأفكار الفنية للتحكم عن بُعد.
أولاً ، يتم توصيل جهاز الكمبيوتران من خلال مقبس Java.net.
افتح أولاً خدمًا على طرف واحد ، ثم تواصل مع الطرف الآخر بمقبس.
جانب الخادم
يجب إعداد Serversocket ويتم تهيئة تدفقات الإدخال والمخرجات المطلوبة:
Public Static Void OpenServer () يلقي ioException ، classNotFoundException {system.out.println ("ServerStart ......") ؛ Serversocket Server = New Serversocket (7777) ؛ Socket = server.accept () ؛ System.out.println ("On Connection .../n"+Socket) ؛ OIS = جديد ObjectInputStream (Socket.getInputStream ()) ؛ OOS = new ObjectOutputStream (Socket.getOutputStream ()) ؛ }جانب العميل <br /> يجب استخدام المقبس للاتصال بالخادم وتهيئة دفق الإدخال والإخراج:
startconnection start static static static (سلسلة IP ، منفذ int) unknownhostexception ، ioException ، awtexception {socket = new Socket ("192.168.0.106" ، 7777) ؛ if (socket.isconnected ()) {system.out.println ("Socket connect ..."+socket) ؛ } oos = new ObjectOutputStream (socket.getOutputStream ()) ؛ OIS = جديد ObjectInputStream (Socket.getInputStream ()) ؛ }وبهذه الطريقة ، يتم ربط جهاز الكمبيوتران معًا ويمكن تبادل البيانات من خلال التدفقات (InputStream و OutderStream).
بعد ذلك ، يمكنك التفكير في المعلومات التي يحتاجها جهاز كمبيوتر إلى جهاز التحكم عن بُعد؟ أولاً ، تحتاج النهاية التي يتم التحكم فيها إلى توفير صورة الشاشة بشكل مستمر لنهاية التحكم (سيتم تنفيذ ذلك باستخدام java.awt.robot) ، ثم تقوم الماوس ولوحة المفاتيح بنفس العملية بناءً على الحدث (inputevent) المنقولة بواسطة نهاية التحكم (التي تم تنفيذها باستخدام الروبوت). بعد ذلك ، يجب أولاً استلام نهاية التحكم في الصورة التي يتم نقلها بواسطة النهاية التي يتم التحكم فيها وتعكسها على لوحة (جزء) ، ثم مراقبة تصرفات لوحة المفاتيح والماوس على الجهاز ثم تمريرها إلى مضيف الطرف الذي يتم التحكم فيه (يمكننا القيام بذلك عن طريق تعيين مستمع على جزء اللوحة)
تتمثل إحدى المشكلات التي واجهتها هنا في أن الصور المستخدمة في الإرسال لا يمكن تسلسلها سواء كانت تستخدم الصورة أو المخزن المؤقت. لذلك ، لا يمكن استخدام I/Ostream للإرسال. لذلك ، من أجل حل هذه المشكلة ، نحتاج إلى تغليف بيانات الصورة في فئة وتنفيذ فئة صورة الواجهة القابلة للتسلسل كما يلي:
استيراد java.io.file ؛ استيراد java.io.fileinputStream ؛ استيراد java.io.filenotfoundexception ؛ استيراد java.io.ioException ؛ استيراد java.io.serializable ؛ رسالة الطبقة العامة تنفذ مسلسل {private static intervisionuid = 1l ؛ اسم الملف الخاص بالسلسلة ؛ // اسم الملف الخاص الطويل الطويل ؛ // طول الملف البايت الخاص [] fileContent ؛ // File Content Public Message () {} Message (String filepath) يلقي ioException {file file = file new (filepath) ؛ this.fileLength = file.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 ؛ } السلسلة العامة getFilename () {return filename ؛} public void setFilename (string filename) {this.filename = filename ؛} public getFilelength () {return fileLength ؛ } public void setFilelEllenge (طول long fileLength) {this.fileLength = fileLength ؛} البايت العام [] getFileContent () {return fileContent ؛} public void setFileContent (byte []هذا يتيح نشر الصورة من خلال تسلسل ObjectInputStream و ObjectOutputStream
بعد فهم الأساسيات المذكورة أعلاه ، يجب أولاً إكمال إعداد واجهة واجهة المستخدم ، واستقبال الصور ، ولوحة المفاتيح وعمل الفأر لجانب التحكم:
أولاً ، قم بإعداد الصورة المستقبلة:
public static void reveivepic () يلقي classnotfoundException ، ioException {message g = (message) ois.ReadObject () ؛ fileOutputStream fos = new FileOutputStream ("d: // out //"+g.getFilename ()) ؛ fos.write (g.getFileContent () ، 0 ، (int) g.getFilelEllenge ()) ؛ fos.flush () ؛ fileInputStream fis = new FileInputStream ("d: // out //"+g.getFilename ()) ؛ BufferedImage BI = Imageio.Read (FIS) ؛ IIC = new ImageIcon (BI) ؛ صورة IMG = iic.getImage () ؛ Toolkit tk = toolkit.getDefaultToolkit () ؛ البعد D = tk.getScreensize () ؛ int w = d.width ؛ int H = D.Height ؛ BufferedImage BI = تغيير الحجم (IMG ، 800،600) ؛ image_lab.seticon (New ImageIcon (Bi)) ؛ img_lab.repaint () ؛ // pind بعيدا الخلفية التي رسمتها قبل} تغيير حجم static bufferedimage الخاص (صورة IMG ، int neww ، int newh) {int w = img.getWidth (null) ؛ int h = img.getheight (null) ؛ bufferedImage dimg = جديد 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 () {// console title jframe jf = new JFrame ("console") ؛ setListener (JF) ؛ // وحدة التحكم jf.setsize (500 ، 400) ؛ // يتم استخدام imag_lab لتخزين الصورة imag_lab = new Jlabel () ؛ jf.add (imag_lab) ؛ // setVisible (True) ؛ // Console Top Jf.SetAlwaysontop (true) ؛ jf.setResible (صواب) ؛ jf.setDefaultCloseOperation (jframe.exit_on_close) ؛ }المستمع:
Settic Settic Settic Setlistener (JFRAME Frame) {// SET SET SET Frame.AdDKeyListener (New KeyAdapter () {public void keypressed (keyevent e) {sendVentObject (e) ؛} @keyrele eyerex exerever (keyevent e) frame.addmousewheellistener (new mousewheellistener () {public void mousewheelmoved (mousewheelevent e) {sendEventObject (e) ؛}}) ؛ frame.addmousemotionListener (new mousemotionListener () {public void mousedragged (mouseevent e) {sendVentObject (e) ؛} public void mousemoved (mouseevent e) {sendVentObject (e) ؛}}) ؛ fram.addmouselistener (new mouselistener () {public void mouseclicked (mouseevent e) {sendeventObject (e) ؛ e) {sendVentObject (e) ؛ } private static void sendVentObject (inPutevent event) {try {system.out.println ("send") ؛ OOS.WriteObject (حدث) ؛ ooos.flush () ؛ } catch (استثناء ef) {ef.printstacktrace () ؛ }ما سبق يكمل نهاية التحكم.
بعد ذلك سنبني النهاية التي يتم التحكم فيها:
تحتاج النهاية التي يتم التحكم فيها إلى استخدام الروبوت لالتقاط لقطات الشاشة وإرسالها ، ومن الضروري كتابة طريقة للتفاعل مع inputevent المستلمة أولاً: لقطات الشاشة وترسل:
public static void capturepic () يلقي 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 = strenge (0 ، 0 ، (int) dm.getwidth () ، (int) dm .getheight ()) ؛ BufferedImage bimage = robot.createscreencapture (REC) ؛ // احفظ الصورة إلى سلسلة ملفات filepath = "d: // out // screenshot"+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) ؛ ooos.flush () ؛ }}لاحظ أن هذا الرمز يستخدم D:/ Out/ Directory كمكان تخزين للملفات المؤقتة. يحتاج القراء إلى تعيين تخزين المستندات المؤقتة بأنفسهم عند استخدام هذا الرمز.
ثم قم بتنفيذ Robot للعمل على تعليمات inputevent المستلمة:
Action public void Action () يلقي Awtexception ، classnotfoundException ، ioException {robot robot = new robot () ؛ بينما (صحيح) {inPutevent e = (inPutevent) ois.ReadObject () ؛ if (e! = null) {handlevents (robot ، e) ؛}}} مقابض الفراغ الثابتة العامة (عمل الروبوت ، حدث inputevent) {mouseevent mevent = null ؛ // mouse event mousewheelevent mwevent = null ؛ // mouse scroll event keyevent kevent = null ؛ // keyboard event int mousebuttonmask = -100 ؛ // Mouse Key Switch (event.getID ()) {case mousevent.mouse_move: // mouse movement mevent = (mouseevent) event ؛ Action.mousemove (mevent.getx () ، mevent.gety ()) ؛ استراحة ؛ case mouseevent.mouse_pressed: // mouse key press mevent = (mouseevent) حدث ؛ Action.mousemove (mevent.getx () ، mevent.gety ()) ؛ mousebuttonmask = getMouseClick (mevent.getButton ()) ؛ إذا (mousebuttonmask! = -100) Action.mousepress (MouseButtonmask) ؛ استراحة؛ CASE mouseevent.mouse_releded: // reegr the mouse button mevent = (mouseevent) event ؛ 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.getWhealrotation ()) ؛ استراحة ؛ حالة mouseevent.mouse_dragged: // mouse drag mevent = (mouseevent) حدث ؛ Action.mousemove (mevent.getx () ، mevent.gety ()) ؛ استراحة ؛ case keyevent.key_pressed: // key kevent = (keyevent) event ؛ Action.keypress (kevent.getKeyCode ()) ؛ استراحة ؛ case keyevent.key_releded: // solved kevent kevent = (keyevent) event ؛ Action.KeyRelease (kevent.getKeyCode ()) ؛ استراحة ؛ الافتراضي: استراحة ؛ }} private static int getMouseClick (زر int) {// احصل على زر الماوس إذا (button == mouseevent.button1) // المفتاح الأيسر ، فإن المفتاح الأوسط هو button2 return inputevent.button1_mask ؛ if (button == mouseevent.button3) // key key return inputevent.button3_mask ؛ العودة -100 ؛ }ينتهي البرنامج بأكمله هنا. البرنامج أعلاه لا ينفذ تغليف الخيوط البشرية الآلية. يمكن تنزيل الرمز الكامل الذي يمكن استخدامه من موارد الموقع التالية: http://xiazai.vevb.com/201608/yuanma/java-romotecontrol(vevb.com).rar
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.