يصف المثال الموجود في هذه المقالة كيفية تنفيذ وظيفة مشاركة الشاشة في Java. شاركها مع الجميع لتكون مرجعا لك. التحليل المحدد هو كما يلي:
أقوم مؤخرًا بتصميم دورة تدريبية في هندسة البرمجيات، وإنشاء نظام مراقبة الشاشة للمختبر، والإشارة إلى الرموز السابقة المختلفة، وأخيرًا تحويل الكود الخاص بي بعد فهمه، وهذه هي الطريقة التي يقلدها المبتدئون.
عندما يتعلق الأمر بنظام مراقبة الشاشة، هناك جانب المعلم وجانب الطالب. جانب المعلم هو جانب الخادم، وجانب الطالب هو جانب العميل. من المحتمل أن يكون بث الشاشة ومراقبة الشاشة أحد الجوانب الأكثر إثارة للاهتمام في النظام. أما بقية المكالمة وقفل الشاشة وإيقاف التشغيل المجدول فهي بسيطة نسبيًا.
بث الشاشة، من حيث تنفيذ الوظيفة، بصراحة، هو أن جهاز المعلم يعترض باستمرار معلومات الشاشة ويرسلها إلى كمبيوتر كل طالب في شكل صور، حتى يتمكن الطلاب من رؤية عمليات المعلم على الكمبيوتر ما يسمى بث الشاشة.
هناك شيء مزعج هنا، وهو أنه عند التقاط لقطة للشاشة، لا توجد معلومات الماوس. ولكن هناك حلان:
① عند إرسال معلومات لقطة الشاشة، ارسم الماوس على الصورة، بحيث يكون هناك فأران على جانب الطالب، ويمكن لجانب الطالب تحريك الماوس على جهاز الكمبيوتر الخاص به.
②أرسل إحداثيات الماوس من جانب المعلم إلى جانب الطالب، ويتحرك فأرة الكمبيوتر الخاصة بالطالب في الوقت الفعلي وفقًا لمعلومات الإحداثيات، وهذا يتضمن في الواقع وظيفة التحكم، ولا يمكن لجانب الطالب تحريك الماوس.
تعتبر مراقبة الشاشة أمرًا صعبًا نسبيًا، فهي تحتوي في الواقع على وظيفتين:
①يمكن للمعلم مراقبة شاشات الكمبيوتر لجميع الطلاب.
②يتحكم المعلم في جهاز الكمبيوتر الخاص بالطالب؛
نظرًا لأنه يتضمن التزامن، يجب على كل عميل إرسال معلومات الشاشة إلى المعلم في الوقت الفعلي، الأمر الذي سيكون مزعجًا بعض الشيء، ولكن لا يزال من الممكن تحقيقه.
يتم تنفيذ وظيفة مشاركة الشاشة بدون استخدام الماوس مؤقتًا هنا، وهي بسيطة نسبيًا وتحتاج إلى التحسين، ولكن يمكن استخدامها كفئة أدوات للتكامل لاحقًا.
الأول هو خادم المعلم:
انسخ الكود كما يلي: package Test;
import java.awt.Dimension;
import java.awt.Rectangle;
استيراد java.awt.Robot؛
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
استيراد java.net.Socket؛
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import javax.imageio.ImageIO;
/*
*لي 2014-11-20
* يختفي هذا النوع من إرسال لقطات الشاشة في الوقت الفعلي، ويتم التنفيذ متعدد الخيوط، ولا يتضمن معلومات الماوس، ولا يعمل على تحسين كل عميل.
*/
الطبقة العامة SendScreenImg تمتد الموضوع
{
SERVERPORT int العام الثابت = 8000؛
ServerSocket الخاص serverSocket؛
روبوت خاص؛
شاشة البعد العام.
المستطيل العام؛
مقبس المقبس الخاص؛
الفراغ العام الثابت الرئيسي (سلسلة الحجج [])
{
جديد SendScreenImg(SERVERPORT).start();
}
// طريقة البناء لفتح روبوت اتصال المقبس والحصول على حجم الشاشة
SendScreenImg العام (int SERVERPORT)
{
يحاول {
serverSocket = new ServerSocket(SERVERPORT);
serverSocket.setSoTimeout(864000000);
روبوت = روبوت جديد ()؛
} قبض (الاستثناء ه) {
printStackTrace();
}
screen = Toolkit.getDefaultToolkit().getScreenSize(); // احصل على حجم الشاشة الرئيسية
rect = new Rectangle(screen); // إنشاء مستطيل بحجم الشاشة
}
@تجاوز
تشغيل الفراغ العام ()
{
// الانتظار في الوقت الفعلي لتلقي رسائل لقطة الشاشة
بينما (صحيح)
{
يحاول{
المقبس = serverSocket.accept();
System.out.println("منفذ الطالب متصل");
ZipOutputStream zip = new ZipOutputStream(new DataOutputStream(socket.getOutputStream()));
zip.setLevel(9); // اضبط مستوى الضغط
BufferedImage img = robot.createScreenCapture(rect);
zip.putNextEntry(new ZipEntry("test.jpg"));
ImageIO.write(img, "jpg", zip);
if(zip!=null)zip. Close();
System.out.println("العميل متصل في الوقت الفعلي");
} التقاط (IOException ioe) {
System.out.println("تم قطع الاتصال");
} أخيراً {
إذا (المقبس! = فارغ) {
يحاول {
المقبس. إغلاق ()؛
} قبض على (IOException e) {e.printStackTrace();}
}
}
}
}
}
ثم هناك العميل الطالب:
انسخ الكود كما يلي: package Test;
import java.awt.Frame;
import java.awt.Image;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.IOException;
استيراد java.net.Socket؛
import java.util.concurrent.TimeUnit;
import java.util.zip.ZipInputStream;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
/*
*لي 2014-11-20
* يتم استخدام هذا الفصل لتلقي معلومات الشاشة من جانب المعلم، باستثناء الماوس، ويحتاج إلى التحسين.
*/
الطبقة العامة ReceiveImages تمتد الموضوع {
إطار BorderInit العام؛
مقبس المقبس العام؛
سلسلة IP العامة؛
public static void main(String[] args){
new ReceiveImages(new BorderInit(), "127.0.0.1").start();
}
صور الاستقبال العامة (إطار BorderInit، سلسلة IP)
{
this.frame =frame;
this.IP=IP;
}
تشغيل الفراغ العام () {
بينما(frame.getFlag()){
يحاول {
المقبس = مقبس جديد (IP،8000)؛
DataInputStream ImgInput = new DataInputStream(socket.getInputStream());
ZipInputStream imgZip = new ZipInputStream(ImgInput);
imgZip.getNextEntry(); // انتقل إلى بداية دفق الملف المضغوط
Image img = ImageIO.read(imgZip); // اقرأ الصور الموجودة في دفق الصور المضغوطة وفقًا للبايت
frame.jlbImg.setIcon(new ImageIcon(img));
System.out.println("رقم الاتصال"+(System.currentTimeMillis()/1000)%24%60+"ثانية");
التحقق من صحة ()؛
TimeUnit.MILLISECONDS.sleep(50);//الفاصل الزمني لتلقي الصور
imgZip. Close();
} قبض على (IOException | InterruptedException e) {
System.out.println("تم قطع الاتصال");
}أخيراً{
يحاول {
المقبس. إغلاق ()؛
} قبض على (IOException e) {}
}
}
}
}
// فئة مساعدة للنافذة الجانبية للعميل، تُستخدم خصيصًا لعرض معلومات الشاشة المستلمة من جانب المعلم
يمتد فئة BorderInit إلى JFrame
{
serialVersionUID النهائي الطويل الخاص الثابت = 1L؛
JLabel العامة jlbImg؛
علم منطقي خاص؛
getFlag المنطقية العامة () {
إرجاع هذا.
}
publicBorderInit()
{
this.flag=true;
this.jlbImg = new JLabel();
this.setTitle("المراقبة عن بعد--IP:" + "--الموضوع:" );
this.setSize(400, 400);
//this.setUndecorated(true); // عرض بملء الشاشة، من الأفضل التعليق عليه عند الاختبار
//this.setAlwaysOnTop(true); // تكون نافذة العرض دائمًا في المقدمة
this.add(jlbImg);
this.setLocationRelativeTo(null);
this.setExtendiState(Frame.MAXIMIZED_BOTH);
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.setVisible(true);
this.validate();
// حدث إغلاق النافذة
this.addWindowListener(new WindowAdapter() {
نافذة فارغة عامة (WindowEvent e) {
العلم = خطأ؛
BorderInit.this.dispose();
System.out.println("النموذج مغلق");
System.gc(); // جمع البيانات المهملة
}
});
}
}
هذه وظيفة صغيرة مستخرجة من المنتج غير المكتمل، ولا يزال هناك الكثير مما يجب كتابته قبل أن يتمكن الأصدقاء المهتمون من تحسينه على هذا الأساس.
آمل أن تكون هذه المقالة مفيدة لبرمجة جافا للجميع.