Contoh dalam artikel ini menjelaskan cara mengimplementasikan fungsi berbagi layar di Java. Bagikan dengan semua orang untuk referensi Anda. Analisis spesifiknya adalah sebagai berikut:
Baru-baru ini saya merancang kursus rekayasa perangkat lunak, membuat sistem pemantauan layar untuk laboratorium, mengacu pada berbagai kode pendahulunya, dan akhirnya mengubah kode saya sendiri setelah memahaminya.
Dalam sistem pemantauan layar, ada sisi guru dan sisi siswa. Sisi guru adalah sisi server, dan sisi siswa adalah sisi klien. Salah satu aspek yang lebih menarik dari sistem ini mungkin adalah penyiaran layar dan pemantauan layar. Sisa panggilan absensi, kunci layar, dan penutupan terjadwal relatif sederhana.
Siaran layar, dari segi penerapan fungsinya, terus terang adalah mesin guru yang terus menerus mencegat informasi layar dan mengirimkannya ke komputer masing-masing siswa dalam bentuk gambar, sehingga siswa dapat melihat pengoperasian guru di komputer tersebut yang disebut siaran layar.
Ada yang merepotkan disini yaitu saat mengambil screenshot layar tidak ada informasi mouse. Namun ada dua solusi:
① Saat mengirimkan informasi screenshot, gerakkan mouse pada gambar tersebut, sehingga akan ada dua mouse di sisi siswa, dan sisi siswa dapat menggerakkan mouse di komputernya sendiri.
②Kirimkan koordinat mouse dari sisi guru ke sisi siswa, dan mouse komputer siswa bergerak secara real time sesuai dengan informasi koordinat.Ini sebenarnya melibatkan fungsi kontrol, dan sisi siswa tidak dapat menggerakkan mouse.
Pemantauan layar relatif rumit. Faktanya, ini memiliki dua fungsi:
①Guru dapat memantau semua layar komputer siswa;
②Guru mengontrol komputer siswa;
Karena melibatkan konkurensi, setiap klien harus mengirimkan informasi layar kepada guru secara real time, yang akan sedikit merepotkan, namun masih dapat dicapai.
Fungsi berbagi layar tanpa mouse untuk sementara diterapkan di sini. Fungsi ini relatif sederhana dan perlu ditingkatkan, tetapi dapat digunakan sebagai kelas alat untuk integrasi nanti.
Yang pertama adalah server guru:
Salin kode sebagai berikut: paket Test;
import java.awt.Dimensi;
import java.awt.Rectangle;
impor java.awt.Robot;
impor java.awt.Toolkit;
impor java.awt.image.BufferedImage;
impor java.io.DataOutputStream;
impor java.io.IOException;
impor java.net.ServerSocket;
impor java.net.Socket;
impor java.util.zip.ZipEntry;
impor java.util.zip.ZipOutputStream;
impor javax.imageio.ImageIO;
/*
* Juli 2014-11-20
* Jenis pengiriman tangkapan layar secara real-time ini menghilang, implementasi multi-thread, tidak menyertakan informasi mouse, dan tidak mengoptimalkan setiap Klien.
*/
kelas publik SendScreenImg memperluas Thread
{
publik statis int SERVERPORT=8000;
serverSocket ServerSocket pribadi;
robot robot pribadi;
layar dimensi publik;
persegi panjang publik;
soket Soket pribadi;
public static void main(String args[])
{
SendScreenImg baru(SERVERPORT).start();
}
//Metode konstruksi untuk membuka robot koneksi soket dan mendapatkan ukuran layar
publik SendScreenImg(int SERVERPORT)
{
mencoba {
serverSocket = ServerSocket baru(SERVERPORT);
serverSocket.setSoTimeout(864000000);
robot = Robot baru();
} tangkapan (Pengecualian e) {
e.printStackTrace();
}
screen = Toolkit.getDefaultToolkit().getScreenSize(); //Dapatkan ukuran layar utama
rect = new Rectangle(layar); //Membangun persegi panjang seukuran layar
}
@Mengesampingkan
menjalankan kekosongan publik()
{
//Menunggu secara real time untuk menerima pesan tangkapan layar
sementara (benar)
{
mencoba{
soket = serverSocket.accept();
System.out.println("Port Siswa terhubung");
ZipOutputStream zip = ZipOutputStream baru(DataOutputStream baru(socket.getOutputStream()));
zip.setLevel(9); //Mengatur tingkat kompresi
BufferedImage img = robot.createScreenCapture(persegi);
zip.putNextEntry(ZipEntry baru("test.jpg"));
ImageIO.write(img, "jpg", zip);
if(zip!=null)zip.close();
System.out.println("Klien terhubung secara real time");
} tangkapan (IOException ioe) {
System.out.println("Koneksi terputus");
} Akhirnya {
jika (soket != null) {
mencoba {
soket.close();
} tangkapan (IOException e) {e.printStackTrace();}
}
}
}
}
}
Lalu ada klien pelajar:
Salin kode sebagai berikut: paket Test;
impor java.awt.Frame;
impor java.awt.Gambar;
impor java.awt.event.WindowAdapter;
impor java.awt.event.WindowEvent;
impor java.io.DataInputStream;
impor java.io.IOException;
impor java.net.Socket;
import java.util.bersamaan.TimeUnit;
impor java.util.zip.ZipInputStream;
impor javax.imageio.ImageIO;
impor javax.swing.ImageIcon;
impor javax.swing.JFrame;
impor javax.swing.JLabel;
/*
* Juli 2014-11-20
* Kelas ini digunakan untuk menerima informasi layar di sisi guru, tidak termasuk mouse, dan perlu dioptimalkan.
*/
kelas publik AcceptImages memperluas Thread{
bingkai BorderInit publik;
soket soket umum;
IP String publik;
public static void main(String[] args){
PenerimaanImages baru(BorderInit baru(), "127.0.0.1").start();
}
Penerimaan Gambar publik (bingkai BorderInit, String IP)
{
this.frame = bingkai;
ini.IP=IP;
}
menjalankan kekosongan publik() {
while(frame.getFlag()){
mencoba {
soket = Soket baru(IP,8000);
DataInputStream ImgInput = DataInputStream baru(socket.getInputStream());
ZipInputStream imgZip = ZipInputStream baru(ImgInput);
imgZip.getNextEntry(); //Pergi ke awal aliran file Zip
Image img = ImageIO.read(imgZip); //Baca gambar dalam aliran gambar Zip menurut byte
frame.jlbImg.setIcon(Ikon Gambar baru(img));
System.out.println("Nomor koneksi"+(System.currentTimeMillis()/1000)%24%60+"detik");
frame.validasi();
TimeUnit.MILLISECONDS.sleep(50);//Interval waktu untuk menerima gambar
imgZip.close();
} catch (IOException | InterruptedException e) {
System.out.println("Koneksi terputus");
}Akhirnya{
mencoba {
soket.close();
} tangkapan (IOException e) {}
}
}
}
}
//Kelas tambahan jendela sisi klien, khusus digunakan untuk menampilkan informasi layar yang diterima dari sisi guru
kelas BorderInit memperluas JFrame
{
serialVersionUID panjang akhir statis pribadi = 1L;
JLabel publik jlbImg;
bendera boolean pribadi;
boolean publik getFlag(){
kembalikan this.flag;
}
Batasan Publik Init()
{
this.flag=benar;
this.jlbImg = JLabel baru();
this.setTitle("Pemantauan jarak jauh--IP:" + "--Topik:" );
ini.setUkuran(400, 400);
//this.setUndecorated(true); //Tampilan layar penuh, yang terbaik adalah memberi komentar saat pengujian
//this.setAlwaysOnTop(true); //Jendela tampilan selalu di depan
ini.tambahkan(jlbImg);
this.setLocationRelativeTo(null);
this.setExendedState(Frame.MAXIMIZED_BOTH);
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.setVisible(benar);
ini.validasi();
//acara penutupan jendela
this.addWindowListener(WindowAdapter baru() {
jendela kekosongan publikPenutupan(WindowEvent e) {
bendera=salah;
BorderInit.ini.buang();
System.out.println("Formulir ditutup");
Sistem.gc(); //pengumpulan sampah
}
});
}
}
Berikut adalah fungsi kecil yang diambil dari produk yang belum jadi. Masih banyak yang harus ditulis sebelum produk jadi. Teman-teman yang tertarik dapat memperbaikinya atas dasar ini.
Saya harap artikel ini bermanfaat untuk pemrograman Java semua orang.