ตัวอย่างในบทความนี้อธิบายวิธีการใช้ฟังก์ชันการแชร์หน้าจอใน Java แบ่งปันกับทุกคนสำหรับการอ้างอิงของคุณ การวิเคราะห์เฉพาะมีดังนี้:
ล่าสุดฉันกำลังออกแบบหลักสูตรวิศวกรรมซอฟต์แวร์ สร้างระบบตรวจสอบหน้าจอสำหรับห้องปฏิบัติการ อ้างอิงถึงโค้ดรุ่นก่อนๆ และในที่สุดก็แปลงโค้ดของตัวเองหลังจากเข้าใจแล้ว นี่คือวิธีที่มือใหม่เลียนแบบ
เมื่อพูดถึงระบบตรวจสอบหน้าจอ จะมีฝั่งครูและฝั่งนักเรียน ฝั่งครูคือฝั่งเซิร์ฟเวอร์ และฝั่งนักเรียนคือฝั่งไคลเอ็นต์ ด้านที่น่าสนใจอย่างหนึ่งของระบบน่าจะเป็นการถ่ายทอดหน้าจอและการตรวจสอบหน้าจอ ส่วนที่เหลือของการโทร การล็อคหน้าจอ และการปิดระบบตามกำหนดเวลานั้นค่อนข้างง่าย
ถ้าพูดตรงๆ ก็คือ การถ่ายทอดหน้าจอ ก็คือเครื่องของครูจะดักจับข้อมูลหน้าจออย่างต่อเนื่องและส่งไปยังคอมพิวเตอร์ของนักเรียนแต่ละคนในรูปแบบของรูปภาพ เพื่อให้นักเรียนเห็นการทำงานของครูบนคอมพิวเตอร์ได้ การออกอากาศทางหน้าจอที่เรียกว่า
มีเรื่องลำบากตรงนี้คือตอนแคปหน้าจอไม่มีข้อมูลเมาส์ แต่มีสองวิธีแก้ไข:
1 เมื่อส่งข้อมูลภาพหน้าจอ ให้วาดเมาส์บนภาพ เพื่อให้มีหนูสองตัวที่ฝั่งนักเรียน และฝั่งนักเรียนสามารถเลื่อนเมาส์บนคอมพิวเตอร์ของตนเองได้
②ส่งพิกัดเมาส์ของฝั่งครูไปยังฝั่งนักเรียน และเมาส์คอมพิวเตอร์ของนักเรียนจะเคลื่อนที่แบบเรียลไทม์ตามข้อมูลพิกัด ซึ่งจริงๆ แล้วเกี่ยวข้องกับฟังก์ชันการควบคุม และฝั่งของนักเรียนไม่สามารถขยับเมาส์ได้
การตรวจสอบหน้าจอค่อนข้างยุ่งยาก จริงๆ แล้วมีสองฟังก์ชัน:
1) ครูสามารถตรวจสอบหน้าจอคอมพิวเตอร์ของนักเรียนทุกคนได้
②ครูควบคุมคอมพิวเตอร์ของนักเรียน
เนื่องจากมีการทำงานพร้อมกัน ลูกค้าแต่ละรายจึงต้องส่งข้อมูลหน้าจอไปให้อาจารย์แบบเรียลไทม์ ซึ่งอาจจะยุ่งยากสักหน่อยแต่ก็ยังทำได้
ฟังก์ชั่นการแชร์หน้าจอโดยไม่ต้องใช้เมาส์ถูกใช้งานชั่วคราวที่นี่ ค่อนข้างง่ายและจำเป็นต้องได้รับการปรับปรุง แต่สามารถใช้เป็นคลาสเครื่องมือสำหรับการรวมเข้าด้วยกันในภายหลัง
อย่างแรกคือเซิร์ฟเวอร์ครู:
คัดลอกรหัสดังต่อไปนี้: การทดสอบแพ็คเกจ;
นำเข้า java.awt.Dimension;
นำเข้า java.awt.Rectangle;
นำเข้า java.awt.Robot;
นำเข้า java.awt.Toolkit;
นำเข้า java.awt.image.BufferedImage;
นำเข้า java.io.DataOutputStream;
นำเข้า java.io.IOException;
นำเข้า java.net.ServerSocket;
นำเข้า java.net.Socket;
นำเข้า java.util.zip.ZipEntry;
นำเข้า java.util.zip.ZipOutputStream;
นำเข้า javax.imageio.ImageIO;
-
* 20-11-2557
* การส่งภาพหน้าจอแบบเรียลไทม์ประเภทนี้จะหายไป การใช้งานแบบมัลติเธรด ไม่รวมข้อมูลเมาส์ และไม่ได้เพิ่มประสิทธิภาพไคลเอนต์แต่ละราย
-
คลาสสาธารณะ SendScreenImg ขยายเธรด
-
int สาธารณะคงที่ SERVERPORT = 8000;
ServerSocket ส่วนตัว serverSocket;
หุ่นยนต์หุ่นยนต์ส่วนตัว
หน้าจอมิติสาธารณะ
สี่เหลี่ยมผืนผ้าสาธารณะ;
ซ็อกเก็ตซ็อกเก็ตส่วนตัว
โมฆะคงสาธารณะหลัก (String args [])
-
ใหม่ SendScreenImg(SERVERPORT).start();
-
//วิธีการก่อสร้างเพื่อเปิดหุ่นยนต์เชื่อมต่อซ็อกเก็ตและรับขนาดหน้าจอ
SendScreenImg สาธารณะ (int SERVERPORT)
-
พยายาม {
serverSocket = ServerSocket ใหม่ (SERVERPORT);
serverSocket.setSoTimeout(864000000);
หุ่นยนต์ = หุ่นยนต์ใหม่ ();
} จับ (ข้อยกเว้นจ) {
e.printStackTrace();
-
screen = Toolkit.getDefaultToolkit().getScreenSize(); //รับขนาดของหน้าจอหลัก
rect = สี่เหลี่ยมผืนผ้าใหม่ (หน้าจอ); // สร้างสี่เหลี่ยมขนาดหน้าจอ
-
@แทนที่
การรันโมฆะสาธารณะ ()
-
//กำลังรอรับข้อความภาพหน้าจอแบบเรียลไทม์
ในขณะที่(จริง)
-
พยายาม{
ซ็อกเก็ต = serverSocket.accept ();
System.out.println("เชื่อมต่อพอร์ตนักเรียนแล้ว");
ZipOutputStream zip = ZipOutputStream ใหม่ (DataOutputStream ใหม่ (socket.getOutputStream()));
zip.setLevel(9); //ตั้งค่าระดับการบีบอัด
BufferedImage img = robot.createScreenCapture(rect);
zip.putNextEntry(ZipEntry ใหม่("test.jpg"));
ImageIO.write(img, "jpg", zip);
ถ้า(zip!=null)zip.close();
System.out.println("ลูกค้ากำลังเชื่อมต่อแบบเรียลไทม์");
} จับ (IOException ioe) {
System.out.println("การเชื่อมต่อถูกตัดการเชื่อมต่อ");
} ในที่สุด {
ถ้า (ซ็อกเก็ต != null) {
พยายาม {
ซ็อกเก็ต.ปิด();
} จับ (IOException e) {e.printStackTrace();}
-
-
-
-
-
จากนั้นก็มีลูกค้านักศึกษา:
คัดลอกรหัสดังต่อไปนี้: การทดสอบแพ็คเกจ;
นำเข้า java.awt.Frame;
นำเข้า java.awt.Image;
นำเข้า java.awt.event.WindowAdapter;
นำเข้า java.awt.event.WindowEvent;
นำเข้า java.io.DataInputStream;
นำเข้า java.io.IOException;
นำเข้า java.net.Socket;
นำเข้า java.util.concurrent.TimeUnit;
นำเข้า java.util.zip.ZipInputStream;
นำเข้า javax.imageio.ImageIO;
นำเข้า javax.swing.ImageIcon;
นำเข้า javax.swing.JFrame;
นำเข้า javax.swing.JLabel;
-
* 20-11-2557
* คลาสนี้ใช้เพื่อรับข้อมูลหน้าจอฝั่งอาจารย์ ไม่รวมเมาส์ และจำเป็นต้องปรับให้เหมาะสม
-
ReceiverImages คลาสสาธารณะขยายเธรด {
เฟรม BorderInit สาธารณะ
ซ็อกเก็ตซ็อกเก็ตสาธารณะ;
IP สตริงสาธารณะ;
โมฆะคงที่สาธารณะ main (String [] args) {
รับรูปภาพใหม่ (BorderInit ใหม่ (), "127.0.0.1"). เริ่มต้น ();
-
รับรูปภาพสาธารณะ (เฟรม BorderInit, สตริง IP)
-
this.frame = เฟรม;
นี้.IP=IP;
-
โมฆะสาธารณะวิ่ง () {
ในขณะที่(frame.getFlag()){
พยายาม {
ซ็อกเก็ต = ซ็อกเก็ตใหม่ (IP,8000);
DataInputStream ImgInput = DataInputStream ใหม่ (socket.getInputStream());
ZipInputStream imgZip = ZipInputStream ใหม่ (ImgInput);
imgZip.getNextEntry(); //ไปที่จุดเริ่มต้นของสตรีมไฟล์ Zip
Image img = ImageIO.read(imgZip); // อ่านรูปภาพในสตรีมรูปภาพ Zip ตามไบต์
frame.jlbImg.setIcon (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(){
กลับ this.flag;
-
สาธารณะBorderInit()
-
นี้.flag=true;
this.jlbImg = JLabel ใหม่ ();
this.setTitle("การตรวจสอบระยะไกล--IP:" + "--หัวข้อ:" );
นี้.setSize(400, 400);
//this.setUndecorated(true); //การแสดงผลแบบเต็มหน้าจอ วิธีที่ดีที่สุดคือแสดงความคิดเห็นเมื่อทำการทดสอบ
//this.setAlwaysOnTop(true); //หน้าต่างแสดงผลจะอยู่ด้านหน้าเสมอ
this.add(jlbImg);
this.setLocationRelativeTo(null);
this.setEXTENDEDState (เฟรม MAXIMIZED_BOTH);
this.setDefaultCloseOperation (DISPOSE_ON_CLOSE);
this.setVisible (จริง);
นี้.ตรวจสอบ();
//เหตุการณ์ปิดหน้าต่าง
this.addWindowListener (WindowAdapter ใหม่ () {
โมฆะสาธารณะ windowClosing (WindowEvent e) {
ธง=เท็จ;
BorderInit.this.dispose();
System.out.println("ปิดแบบฟอร์มแล้ว");
System.gc(); //รวบรวมขยะ
-
-
-
-
นี่คือฟังก์ชันเล็กๆ น้อยๆ ที่ดึงมาจากผลิตภัณฑ์ที่ยังไม่เสร็จ ยังมีอีกหลายสิ่งที่ต้องเขียนก่อนจะผลิตเสร็จ เพื่อน ๆ ที่สนใจสามารถปรับปรุงได้บนพื้นฐานนี้
ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับการเขียนโปรแกรม Java ของทุกคน