Contoh dalam artikel ini menjelaskan bagaimana Java mengimplementasikan penyiaran layar dengan mengendalikan mouse. Bagikan dengan semua orang untuk referensi Anda. Analisis spesifiknya adalah sebagai berikut:
Pada artikel sebelumnya “Analisis Contoh Penerapan Fungsi Berbagi Layar di Java” telah disebutkan bahwa tidak ada mouse saat menangkap layar. Untuk melihat mouse di antarmuka guru, Anda dapat mengarahkan mouse ke setiap tangkapan layar kapan menangkap layar.Namun, karena tangkapan layar diambil satu per satu, mouse yang Anda lihat pasti akan sedikit macet. Saya menulis applet kontrol mouse Java sebelumnya, dan Anda dapat melihat demonstrasi mouse dengan cara ini.
Metode penerapannya juga cukup sederhana. Dua artikel sebelumnya masing-masing menerapkan fungsi kontrol mouse dan berbagi layar tanpa mouse. Mari kita analisis secara singkat di bawah ini.
Di sisi server, SendScreenImg dan SendMouseMessage dianggap sebagai dua kelas alat, masing-masing mendengarkan port yang berbeda. Keduanya mengimplementasikan kelas Thread, dan kami menggunakan kelas ExecutorService kumpulan thread untuk mengontrolnya.
Dua port digunakan, karena saya belum tahu cara mengirim informasi mouse dan informasi gambar secara bersamaan. Mungkin saya bisa mengubah gambar menjadi array byte dan meletakkan koordinat mouse di depan array, tetapi dalam kasus ini mouse mungkin tidak Ini akan menjadi tidak koheren, karena kecepatan transmisi koordinat mouse akan lebih cepat daripada transmisi gambar. Nah, coba lagi jika Anda punya waktu.
Analogi kliennya sama seperti di atas.
Ini kodenya:
pelayan:
Program utama:
Copy kode kodenya seperti berikut:/*
* Kelas siaran layar memanggil dua kelas alat: kelas untuk mengirim informasi tangkapan layar dan kelas untuk mengirim informasi mouse, menggunakan kumpulan thread.
*/
BroderCast kelas publik {
public static void main(String[] args)
{
BroderCast baru();
System.out.println("Mulai");
}
BroderCast publik()
{
Pelaksana ExecutorService = Executors.newFixedThreadPool(2);
exector.execute(SendScreenImg baru());
exector.execute(SendMouseMessage());
}
}
Kirim kode tangkapan layar:
Salin kode sebagai berikut: import java.awt.Dimension;
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;
/*
* Alat: Mengirim informasi tangkapan layar dari sisi guru ke sisi siswa. Tidak ada informasi mouse dan port 8002 digunakan.
* Informasi mouse dapat digambar pada komponen gambar yang dikirim, sehingga informasi mouse dapat dilihat pada antarmuka siswa. Fungsi ini belum diterapkan.
*
*/
kelas publik SendScreenImg memperluas Thread
{
publik int serverPort=8002;
serverSocket ServerSocket pribadi;
robot robot pribadi;
layar dimensi publik;
persegi panjang publik;
soket Soket pribadi;
public static void main(String args[])
{
SendScreenImg().start() baru;
}
kekosongan publik changeServerPort(int serverPort)
{
if(ini.serverPort == serverPort) kembali;
mencoba{
this.serverSocket.close(); //Port saat ini harus ditutup terlebih dahulu
ini.serverPort = serverPort;
serverSocket = ServerSocket baru(ini.serverPort);
serverSocket.setSoTimeout(8000000);
}menangkap(Pengecualian e){}
}
//Metode konstruksi untuk membuka robot koneksi soket dan mendapatkan ukuran layar
publik SendScreenImg()
{
mencoba {
serverSocket = ServerSocket baru(getServerPort());
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 dengan ukuran yang sesuai
}
@Mengesampingkan
menjalankan kekosongan publik()
{
//Menunggu secara real time untuk menerima pesan tangkapan layar
sementara(benar){
mencoba {
soket = serverSocket.accept();
ZipOutputStream zip = ZipOutputStream baru(DataOutputStream baru(socket.getOutputStream()));
zip.setLevel(9); //Mengatur tingkat kompresi
mencoba{
BufferedImage img = robot.createScreenCapture(persegi);
zip.putNextEntry(ZipEntry baru("test.jpg"));
ImageIO.write(img, "jpg", zip);
if(zip!=null)zip.close();
System.out.println("Port Siswa terhubung");
} tangkapan (IOException ioe) {
System.out.println("terminal yang dikontrol: putuskan koneksi");
}
} tangkapan (IOException ioe) {
System.out.println("Kesalahan koneksi");
} Akhirnya {
jika (soket != null) {
mencoba {
soket.close();
} tangkapan (IOException e) {
}
}
}
}
}
}
Kirim informasi mouse:
Copy kode kodenya seperti berikut:/*
* Kelas alat: dapatkan informasi mouse dan kirimkan ke terminal siswa
*/
kelas publik SendMouseMessage memperluas Thread{
pribadi int OPERATE_PORT = 8001;
server ServerSocket pribadi;
soket Soket pribadi;
String pribadi OperateStr;
public static void main(String[] args)
{
SendMouseMessage().start();
}
publik SendMouseMessage(){
mencoba {
server = ServerSocket baru(OPERATE_PORT);
//JOptionPane.showMessageDialog(null, "telah mulai mendengarkan");
} tangkapan (IOException e1) {
e1.printStackTrace();
}
}
//Beberapa thread memonitor klien dalam loop nirkabel
menjalankan kekosongan publik()
{
sementara(benar){
Titik titik = MouseInfo.getPointerInfo().getLocation();
operStr = "Movemouse,"+point.x+","+point.y;
mencoba {
soket = server.accept();
soket.setSoTimeout(1000000);
Keluaran DataOutputStream =DataOutputStream baru(socket.getOutputStream());
keluaran.tulis(operateStr.getBytes());
output.flush(); //Hapus aliran keluaran dan tulis semua byte keluaran yang di-buffer
output.close(); //Tutup aliran output dan lepaskan sumber daya
System.out.println("INFO: "+operateStr);
} tangkapan (IOException e) {
System.out.println("Koneksi terhenti");
break; //Hentikan loop nirkabel saat memutuskan sambungan
}
}
}
}
Klien:
Program utama:
Salin kode sebagai berikut: import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
impor com.Tool.OperateMouse;
impor com.Tool.ReceiveImages;
kelas publik AcceptBroderCast {
pelaksana Pelayanan Pelaksana Umum;
IP String statis publik = "202.216.60.9";
public static void main(String[] args)
{
PenerimaanBroderCast(IP) baru;
}
publik AcceptBroderCast(String IP) {
exector = Pelaksana.newFixedThreadPool(2);
exector.execute (ReceiveImages baru (IP));
exector.execute(OperateMouse(IP) baru);
}
}
Terima kode tangkapan layar:
Copy kode kodenya seperti berikut:/*
* Juli 2014-11-20
* Kelas ini digunakan untuk menerima informasi layar dari sisi guru, tidak termasuk mouse
* Gunakan soket()
*/
kelas publik AcceptImages memperluas Thread{
bingkai BorderInit publik;
soket soket umum;
IP String publik;
public static void main(String[] args){
PenerimaanImages baru("202.216.60.7").start();
}
publicReceiveImages (String IP)
{
frame=BatasInitbaru();
ini.IP=IP;
}
menjalankan kekosongan publik() {
while(frame.getFlag()){
System.out.println("Tersambung"+(System.currentTimeMillis()/1000)%24%60+"detik");
mencoba {
soket = Soket baru(IP,8002);
DataInputStream ImgInput = DataInputStream baru(socket.getInputStream());
ZipInputStream imgZip = ZipInputStream baru(ImgInput);
Gambar img = nol;
mencoba{
imgZip.getNextEntry(); //Pergi ke awal aliran file Zip
img = ImageIO.read(imgZip); //Baca gambar dalam aliran gambar Zip menurut byte
frame.jlbImg.setIcon(Ikon Gambar baru(img));
frame.validasi();
}tangkap (IOException e) {e.printStackTrace();}
mencoba{
imgZip.close();
} tangkapan (IOException e) {
System.out.println("Koneksi terputus");
}
mencoba {
TimeUnit.MILLISECONDS.sleep(50);//Interval waktu untuk menerima gambar
} catch (InterruptedException yaitu) {
yaitu.printStackTrace();
}
} tangkapan (IOException e) {
e.printStackTrace();
}Akhirnya{
mencoba {
soket.close();
} tangkapan (IOException e) {}
}
}
}
}
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);
//ini.setTidak Dihiasi(benar);
//this.setAlwaysOnTop(true); //Selalu di atas
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
}
});
}
}
Menerima informasi mouse dan mengontrol pergerakan mouse:
Salin kode sebagai berikut: import java.awt.AWTException;
impor java.awt.Robot;
impor java.io.BufferedInputStream;
impor java.io.BufferedReader;
impor java.io.DataInputStream;
impor java.io.IOException;
impor java.io.InputStream;
impor java.net.Socket;
impor javax.swing.JOptionPane;
/*
* Kontrol mouse di sisi siswa sama dengan di sisi guru
* Kelas ini bertanggung jawab untuk menerima informasi mouse dan mengontrol pergerakan mouse menggunakan fungsi robot.mouseMove()
*/
kelas publik OperateMouse memperluas Thread{
public static void main(String[] args)
{
OperateMouse baru("202.116.60.7").start();
}
soket Soket pribadi;
IP String publik;
pribadi int OPERATE_PORT = 8001;
robot robot pribadi;
OperateMouse publik (String IP)
{
ini.IP = IP;
}
menjalankan kekosongan publik() {
sementara(benar){
mencoba {
soket = Soket baru(IP,OPERATE_PORT);
robot = Robot baru();
//Dapatkan informasi pergerakan mouse
DataInputStream dataIn = DataInputStream baru(socket.getInputStream());
Informasi string="";
ke dalam r;
while((r=dataIn.read()) != -1){
info +=""+(char)r; //Konversi semua elemen dalam array byte ke tipe karakter
}
dataIn.close();
System.out.println("Aliran data terputus"+info);
jika(info!=batal){
String s[] = info.trim().split(",");
if("Movemouse".sama dengan(s[0].trim()));
{
if (s.panjang == 3) {
int x = Integer.parseInt(s[1].trim());
int y = Integer.parseInt(s[2].trim());
System.out.println("Informasi keluaran mouse"+x+" "+ y);
robot.mouseMove(x, y);
}
}
}
} tangkapan (IOException e) {
System.out.println("Terputus");
merusak;
} tangkapan (AWTException e) {
e.printStackTrace();
}
}
}
}
Saya harap artikel ini bermanfaat untuk pemrograman Java semua orang.