يصف المثال الموجود في هذه المقالة كيفية تنفيذ Java لبث الشاشة عن طريق التحكم بالماوس. شاركها مع الجميع لتكون مرجعا لك. التحليل المحدد هو كما يلي:
في المقالة السابقة "تحليل أمثلة تنفيذ وظيفة مشاركة الشاشة في Java"، تم ذكر أنه لا يوجد ماوس عند التقاط الشاشة. من أجل رؤية الماوس على واجهة المعلم، يمكنك رسم الماوس على كل لقطة شاشة ومع ذلك، نظرًا لأن لقطات الشاشة يتم التقاطها واحدة تلو الأخرى، فمن المؤكد أن الماوس الذي تراه سيكون عالقًا بعض الشيء.
طريقة التنفيذ أيضًا بسيطة جدًا. نفذت المقالتان السابقتان وظائف التحكم بالماوس ومشاركة الشاشة بدون استخدام الماوس على التوالي.
من جانب الخادم، يعتبر SendScreenImg وSendMouseMessage فئتين من الأدوات، يستمعان إلى منافذ مختلفة على التوالي، وكلاهما ينفذ فئة Thread، ونحن نستخدم فئة ExecutorService لتجمع الخيوط للتحكم فيها.
يتم استخدام منفذين، لأنني لا أعرف حتى الآن كيفية إرسال معلومات الماوس ومعلومات الصورة معًا. ربما يمكنني تحويل الصورة إلى مصفوفة بايت ووضع إحداثيات الماوس أمام المصفوفة، ولكن في هذه الحالة قد لا يكون الماوس غير متماسك، لأن سرعة إرسال إحداثيات الماوس ستكون أسرع من نقل الصور. حسنًا، حاول مرة أخرى عندما يكون لديك الوقت.
تشبيه العميل هو نفسه كما هو مذكور أعلاه.
هنا هو الرمز:
الخادم:
البرنامج الرئيسي:
انسخ رمز الكود كما يلي:/*
* تستدعي فئة بث الشاشة فئتين من الأدوات: فئة لإرسال معلومات لقطة الشاشة وفئة لإرسال معلومات الماوس باستخدام تجمع مؤشرات الترابط.
*/
الطبقة العامة BroderCast {
الفراغ العام الثابت الرئيسي (String[] args)
{
جديد BroderCast();
System.out.println("ابدأ");
}
برودر كاست () العامة
{
ExecutorService exctor = Executors.newFixedThreadPool(2);
exctor.execute(new SendScreenImg());
exctor.execute(new SendMouseMessage());
}
}
إرسال رمز لقطة الشاشة:
انسخ الكود كما يلي: 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;
/*
* الأدوات: إرسال معلومات لقطة الشاشة من جانب المعلم إلى جانب الطالب ولا توجد معلومات عن الماوس ويتم استخدام المنفذ 8002.
* يمكن رسم معلومات الفأرة على مكون الصورة المرسلة، بحيث يمكن رؤية معلومات الفأرة على واجهة الطالب ولم يتم تنفيذ هذه الوظيفة بعد.
*
*/
الطبقة العامة SendScreenImg تمتد الموضوع
{
منفذ الخادم العام int=8002;
ServerSocket الخاص serverSocket؛
روبوت خاص؛
شاشة البعد العام.
المستطيل العام؛
مقبس المقبس الخاص؛
الفراغ العام الثابت الرئيسي (سلسلة الحجج [])
{
جديد SendScreenImg().start();
}
التغيير العام الفارغ ServerPort (int serverPort)
{
if(this.serverPort == serverPort) return;
يحاول{
this.serverSocket. Close(); // من الضروري إغلاق المنفذ الحالي أولاً
this.serverPort = serverPort;
serverSocket = new ServerSocket(this.serverPort);
serverSocket.setSoTimeout(8000000);
}قبض(استثناء ه){}
}
// طريقة البناء لفتح روبوت اتصال المقبس والحصول على حجم الشاشة
عام SendScreenImg ()
{
يحاول {
serverSocket = new ServerSocket(getServerPort());
serverSocket.setSoTimeout(864000000);
روبوت = روبوت جديد ()؛
} قبض (الاستثناء ه) {
printStackTrace();
}
screen = Toolkit.getDefaultToolkit().getScreenSize(); // احصل على حجم الشاشة الرئيسية
rect = new Rectangle(screen); // إنشاء مستطيل بالحجم المقابل
}
@تجاوز
تشغيل الفراغ العام ()
{
// الانتظار في الوقت الفعلي لتلقي رسائل لقطة الشاشة
بينما (صحيح) {
يحاول {
المقبس = serverSocket.accept();
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 ioe) {
System.out.println("خطأ في الاتصال");
} أخيراً {
إذا (المقبس! = فارغ) {
يحاول {
المقبس. إغلاق ()؛
} قبض (IOException ه) {
}
}
}
}
}
}
إرسال معلومات الماوس:
انسخ رمز الكود كما يلي:/*
* فئة الأداة: احصل على معلومات الماوس وأرسلها إلى محطة الطالب
*/
الطبقة العامة SendMouseMessage تمتد الموضوع {
الخاص int OPERATE_PORT = 8001؛
خادم ServerSocket الخاص؛
مقبس المقبس الخاص؛
سلسلة خاصة تعمل؛
الفراغ العام الثابت الرئيسي (String[] args)
{
جديد SendMouseMessage().start();
}
عام SendMouseMessage () {
يحاول {
server = new ServerSocket(OPERATE_PORT);
//JOptionPane.showMessageDialog(null, "لقد بدأ الاستماع");
} قبض (IOException e1) {
e1.printStackTrace();
}
}
// مؤشرات الترابط المتعددة تراقب العميل في حلقة لاسلكية
تشغيل الفراغ العام ()
{
بينما (صحيح) {
نقطة النقطة = MouseInfo.getPointerInfo().getLocation();
operatorStr = "Movemouse,"+point.x+"،+point.y;
يحاول {
المقبس = الخادم. قبول ()؛
المقبس.setSoTimeout(1000000);
DataOutputStream input =new DataOutputStream(socket.getOutputStream());
input.write(operateStr.getBytes());
put.flush();//امسح دفق الإخراج واكتب كافة بايتات الإخراج المخزنة
output. Close(); // أغلق دفق الإخراج وحرر الموارد
System.out.println("INFO: "+operateStr);
} قبض (IOException ه) {
System.out.println("توقف الاتصال");
استراحة // أوقف الحلقة اللاسلكية عند قطع الاتصال
}
}
}
}
عميل:
البرنامج الرئيسي:
انسخ الكود كما يلي: import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import com.Tool.OperateMouse;
import com.Tool.ReceiveImages;
الطبقة العامة ريسيبروديركاست {
منفذ ExecutorService العام؛
سلسلة IP العامة الثابتة = "202.216.60.9"؛
الفراغ العام الثابت الرئيسي (String[] args)
{
جديد ReceiveBroderCast(IP);
}
تلقيBroderCast العامة (سلسلة IP) {
executor = Executors.newFixedThreadPool(2);
exctor.execute(new ReceiveImages(IP));
exctor.execute(new OperateMouse(IP));
}
}
تلقي رمز لقطة الشاشة:
انسخ رمز الكود كما يلي:/*
*لي 2014-11-20
* يستخدم هذا الفصل لتلقي معلومات الشاشة من جانب المعلم، باستثناء الماوس
* استخدم المقبس ()
*/
الطبقة العامة ReceiveImages تمتد الموضوع {
إطار BorderInit العام؛
مقبس المقبس العام؛
سلسلة IP العامة؛
public static void main(String[] args){
new ReceiveImages("202.216.60.7").start();
}
publicReceiveImages (سلسلة IP)
{
frame=new BorderInit();
this.IP=IP;
}
تشغيل الفراغ العام () {
بينما(frame.getFlag()){
System.out.println("متصل"+(System.currentTimeMillis()/1000)%24%60+"ثانية");
يحاول {
المقبس = مقبس جديد (IP،8002)؛
DataInputStream ImgInput = new DataInputStream(socket.getInputStream());
ZipInputStream imgZip = new ZipInputStream(ImgInput);
الصورة img = null;
يحاول{
imgZip.getNextEntry(); // انتقل إلى بداية دفق الملف المضغوط
img = ImageIO.read(imgZip); // اقرأ الصور الموجودة في دفق الصور المضغوطة وفقًا للبايت
frame.jlbImg.setIcon(new ImageIcon(img));
التحقق من صحة ()؛
}catch (IOException e) {e.printStackTrace();}
يحاول{
imgZip. Close();
} قبض (IOException ه) {
System.out.println("تم قطع الاتصال");
}
يحاول {
TimeUnit.MILLISECONDS.sleep(50);//الفاصل الزمني لتلقي الصور
} قبض على (InterruptedException أي) {
ie.printStackTrace();
}
} قبض (IOException ه) {
printStackTrace();
}أخيراً{
يحاول {
المقبس. إغلاق ()؛
} قبض على (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(); // جمع البيانات المهملة
}
});
}
}
تلقي معلومات الماوس والتحكم في حركة الماوس:
انسخ الكود كما يلي: import java.awt.AWTException;
استيراد java.awt.Robot؛
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.IOException;
استيراد java.io.InputStream؛
استيراد java.net.Socket؛
import javax.swing.JOptionPane;
/*
* التحكم بالماوس من جانب الطالب هو نفس التحكم من جانب المعلم
* هذه الفئة مسؤولة عن تلقي معلومات الماوس والتحكم في حركة الماوس باستخدام وظيفة robot.mouseMove()
*/
الطبقة العامة OperateMouse تمتد الموضوع {
الفراغ العام الثابت الرئيسي (String[] args)
{
new OperateMouse("202.116.60.7").start();
}
مقبس المقبس الخاص؛
سلسلة IP العامة؛
الخاص int OPERATE_PORT = 8001؛
روبوت خاص؛
ماوس التشغيل العام (سلسلة IP)
{
this.IP = IP;
}
تشغيل الفراغ العام () {
بينما (صحيح) {
يحاول {
المقبس = مقبس جديد (IP، OPERATE_PORT)؛
روبوت = روبوت جديد ()؛
// احصل على معلومات حركة الماوس
DataInputStream dataIn = new DataInputStream(socket.getInputStream());
معلومات السلسلة = ""؛
كثافة العمليات ص؛
بينما((r=dataIn.read()) != -1){
info +=""+(char)r; // تحويل جميع العناصر في مصفوفة البايت إلى نوع الحرف
}
dataIn. Close();
System.out.println("تم قطع تدفق البيانات"+info);
إذا (معلومات! = فارغة) {
String s[] = info.trim().split("،);
if("Movemouse".equals(s[0].trim()));
{
إذا (طول == 3) {
int x = Integer.parseInt(s[1].trim());
int y = Integer.parseInt(s[2].trim());
System.out.println("معلومات إخراج الماوس"+x+" "+ y);
robot.mouseMove(x, y);
}
}
}
} قبض (IOException ه) {
System.out.println("منقطع الاتصال");
استراحة؛
} التقاط (AWTException ه) {
printStackTrace();
}
}
}
}
آمل أن تكون هذه المقالة مفيدة لبرمجة جافا للجميع.