Java mengimplementasikan teknologi remote control
Campuran java.net dan java.awt.robot., Yang datang dengan Java, dapat digunakan untuk mewujudkan kendali jarak jauh komputer lain melalui jaringan, termasuk mengendalikan pergerakan mouse komputer jarak jauh dan input keyboard, dan mendapatkan gambar layar komputer jarak jauh secara real time. Artikel ini akan menggunakan bahasa dan logika ringkas dari dangkal ke dalam untuk mengajari Anda cara menguasai teknik ini.
Pertama, mari kita lihat rendering:
Antarmuka Komputer Jarak Jauh:
Antarmuka Komputer Terminal Kontrol:
Input Terminal Kontrol:
Input jarak jauh:
Mari kita mulai dengan pengenalan terperinci tentang ide -ide teknis remote control.
Pertama, kedua komputer terhubung melalui soket java.net.
Pertama buka server di satu ujung, lalu sambungkan dengan ujung lainnya dengan soket.
Sisi server
Server yang harus diatur dan aliran input dan output yang diperlukan diinisialisasi:
public static void openServer () melempar ioException, ClassNotFoundException {System.out.println ("Serverstart ......"); Server server = server baru (7777); socket = server.accept (); System.out.println ("Di koneksi .../n"+soket); OIS = ObjectInputStream baru (socket.getInputStream ()); Oos = ObjectOutputStream baru (socket.getoutputStream ()); }Sisi Klien <BR /> Soket harus digunakan untuk terhubung ke server dan menginisialisasi aliran input dan output:
public static void startConnection (string ip, int port) melempar UnknownHostException, ioException, AwtException {socket = socket baru ("192.168.0.106", 7777); if (socket.isconnected ()) {System.out.println ("Socket Connected ..."+Socket); } Oos = ObjectOutputStream baru (socket.getoutputStream ()); OIS = ObjectInputStream baru (socket.getInputStream ()); }Dengan cara ini, kedua komputer dihubungkan bersama dan data dapat dipertukarkan melalui aliran (InputStream dan OutputStream).
Selanjutnya, Anda dapat memikirkan informasi apa yang dibutuhkan dua komputer untuk bertukar remote control? Pertama, ujung yang terkontrol perlu terus memberikan gambar layar ke ujung kontrol (ini akan diimplementasikan menggunakan java.awt.robot), dan kemudian mouse dan keyboard melakukan operasi yang sama berdasarkan acara (inputEvent) yang ditransmisikan oleh ujung kontrol (diimplementasikan menggunakan robot). Kemudian ujung kontrol harus terlebih dahulu menerima gambar yang dikirimkan oleh ujung yang dikendalikan dan mencerminkannya pada panel (panel), kemudian memantau tindakan keyboard dan mouse pada mesin dan kemudian meneruskannya ke host ujung yang dikendalikan (kita dapat melakukannya dengan mengatur pendengar di panel)
Satu masalah yang dihadapi di sini adalah bahwa gambar yang digunakan untuk transmisi tidak dapat diserialisasi apakah mereka menggunakan gambar atau bufferedImage. Oleh karena itu, I/Ostream tidak dapat digunakan untuk transmisi. Oleh karena itu, untuk menyelesaikan masalah ini, kita perlu merangkum data gambar di kelas dan mengimplementasikan kelas gambar antarmuka serializable sebagai berikut:
Impor java.io.file; impor java.io.fileInputStream; impor java.io.filenotfoundException; impor java.io.ioException; impor java.io.serializable; Pesan Public Kelas mengimplementasikan serializable {private static final SerialVersionUid = 1l; nama file string pribadi; // Nama File Private Long Long Long; // arsip panjang byte pribadi [] filecontent; // file konten pesan publik () {} pesan publik (string filePath) melempar ioException {file file = file baru (filepath); this.filelength = file.length (); this.fileName = file.getName (); FileInputStream fis = new FileInputStream (FilePath); byte [] bytes = byte baru [(int) filelength]; Fis.read (bytes, 0, (int) filelength); this.fileContent = bytes; } public String getFileName () {return fileName;} public void setFileName (string filename) {this.fileName = filename;} public long getFileLength () {return fileLength; } public void setFileLength (panjang fileelpength) {this.filelength = filelength;} byte publik [] getFileContent () {return filecontent;} public void setFileContent (byte [] filecontent) {this.fileContent = filecontent;}}Ini memungkinkan gambar untuk disebarkan melalui serialisasi ObjectInputStream dan ObjectOutputStream
Setelah memahami dasar -dasar di atas, pertama -tama kita harus menyelesaikan pengaturan antarmuka UI, penerimaan gambar, dan pemantauan aksi keyboard dan mouse dari sisi kontrol:
Pertama, atur gambar penerima:
public static void reveivePic () melempar ClassNotFoundException, ioException {pesan g = (pesan) ois.readObject (); FileOutputStream fos = new fileoutputStream ("d: // out //"+g.getFileName ()); Fos.write (g.getFileContent (), 0, (int) g.getFileLength ()); Fos.flush (); FileInputStream fis = new fileInputStream ("d: // out //"+g.getFileName ()); BufferedImage Bi = ImageIO.READ (FIS); IIC = Imageicon baru (BI); Gambar img = iic.getImage (); Toolkit tk = toolkit.getDefaultToolKit (); Dimensi d = tk.getScreensize (); int w = d.width; int h = d.height; BufferedImage BI = mengubah ukuran (IMG, 800.600); image_lab.seticon (gambar baru (bi)); img_lab.repaint (); // pind latar belakang yang saya ambil sebelumnya} private static bufferedImage ubah ukuran (gambar img, int neww, int newh) {int w = img.getwidth (null); int h = img.getHeight (null); BufferedImage DIMG = BufferedImage baru (neww, newh, bufferedImage.type_int_bgr); Graphics2d G = DIMG.Creategraphics (); G.SetRenderingHint (renderinghints.key_interpolation, renderinghints.value_interpolation_bilinear); G.DrawImage (img, 0, 0, neww, newh, 0, 0, w, h, null); g.dispose (); return dimg; }Dengan cara ini, setelah menerima kelas pesan dari ObjectInputStream, gambar dapat diatur ulang ke ukuran panel panel dan ditampilkan
Langkah selanjutnya adalah mengatur properti dan pendengar panel:
public static void showui () {// judul konsol jframe jf = jframe baru ("konsol"); setListener (JF); // ukuran konsol jf.setsize (500, 400); // imag_lab digunakan untuk menyimpan gambar imag_lab = new jlabel (); jf.add (imag_lab); // setVisible (true); // konsol atas jf.setalwaysontop (true); jf.setriSable (true); jf.setDefaultCloseOperation (jframe.exit_on_close); }Pendengar:
public static void setListener (bingkai jFrame) {// panel set pendengar frame.addkeyListener (keyadapter baru () {public void keypressed (keyevent e) {sendEventObject (e);} @Override public void keyreleased (keyevent e) {sendEventObject (e); eoverride void keyreleased (keyevent e) {sendEventObject (e); }); frame.addmousewheellistener (mousewheellistener baru () {public void mousewheelmoved (mousewheelevent e) {sendEventObject (e);}}); frame.addmouseMotionListener (mousemotionlistener baru () {public void mousedragged (mouseEvent e) {sendEventObject (e);} public void mousemoved (MouseEvent e) {sendEventObject (e);}}); frame.addMouseListener(new MouseListener(){ public void mouseClicked(MouseEvent e) { sendEventObject(e); } public void mouseEntered(MouseEvent e) { sendEventObject(e); } public void mouseExited(MouseEvent e) { sendEventObject(e); } public void mousePressed(MouseEvent e) {sendEventObject (e); } private static void sendEventObject (acara inputEvent) {coba {system.out.println ("kirim"); Oos.writeObject (acara); Oos.flush (); } catch (Exception EF) {EF.PrintStackTrace (); }Di atas menyelesaikan ujung kontrol.
Selanjutnya kita akan membangun ujung yang dikendalikan:
Ujung yang dikendalikan perlu menggunakan robot untuk mengambil tangkapan layar dan mengirim, dan perlu untuk menulis metode untuk bereaksi terhadap inputEvent yang diterima terlebih dahulu: tangkapan layar dan mengirim:
public static void capturepic () melempar awtexception, ioException {robot = robot baru (); Pesan msg = null; Toolkit tk = java.awt.toolkit.getDefaultToolKit (); java.awt.dimension dm = tk.getScreensize (); java.awt.robot robot = java.awt.robot baru (); untuk (int i = 0; i <50; i ++) {// mencegat area layar dari ukuran persegi panjang yang ditentukan rec = rectangle baru (0, 0, (int) dm.getWidth (), (int) dm .getHeight ()); Bimage bimage = robot.createscreencapture (rec); // Simpan gambar ke string file filePath = "d: // out // screenshot"+i+".jpeg"; FileOutputStream fops = FileOutputStream baru (FilePath); javax.imageio.imageio.write (bimage, "jpeg", fops); fops.flush (); fops.close (); msg = pesan baru (filepath); System.out.println (msg.getFileName ()); System.out.println ("Kirim"); Oos.writeObject (msg); Oos.flush (); }}Perhatikan bahwa kode ini menggunakan direktori d:/ out/ sebagai tempat penyimpanan untuk file sementara. Pembaca perlu mengatur penyimpanan dokumen sementara sendiri saat menggunakan kode ini.
Kemudian terapkan robot untuk beroperasi pada instruksi InputEvent yang diterima:
public void action () melempar AwtException, ClassNotFoundException, IoException {robot robot = robot baru (); while (true) {inputEvent e = (inputEvent) ois.readObject (); if (e! = null) {handleevents (robot, e);}}} public static void handleEvents (robot action, inputEvent event) {mouseEvent mevent = null; // acara tikus mousewheelevent mwevent = null; // mouse scroll event keyevent kevent = null; // acara keyboard int mousebuttonmask = -100; // sakelar kunci mouse (event.getId ()) {case mouseEvent.mouse_moved: // mouse gerakan mevent = (mouseEvent) acara; action.mousemove (mevent.getx (), mevent.gety ()); merusak ; case mouseEvent.mouse_pressed: // Key mouse tekan acara mevent = (mouseEvent); action.mousemove (mevent.getx (), mevent.gety ()); mousebuttonmask = getMouseClick (mevent.getButton ()); if (mousebuttonmask! = -100) action.mousepress (mousebuttonmask); merusak; case mouseEvent.mouse_released: // lepaskan tombol mouse mevent = (mouseEvent); action.mousemove (mevent.getx (), mevent.gety ()); mousebuttonmask = getMouseClick (mevent.getButton ()); // Dapatkan tombol mouse if (mousebuttonmask! = -100) action.mouserelease (mousebuttonmask); merusak ; case mouseevent.mouse_wheel: // mouse gulir mwevent = (mousewheelevent) acara; action.mousewheel (mwevent.getwheelrotation ()); merusak ; case mouseevent.mouse_dragged: // mouse drag mevent = (mouseEvent) acara; action.mousemove (mevent.getx (), mevent.gety ()); merusak ; case keyevent.key_pressed: // Key kevent = (keyevent) acara; action.keypress (Kevent.getKeyCode ()); merusak ; case keyevent.key_released: // event key kevent = (keyevent); action.keyrelease (kevent.getKeyCode ()); merusak ; default: break; }} private static int getMouseClick (tombol int) {// Dapatkan tombol mouse if (tombol == mouseEvent.button1) // tombol kiri, tombol tengah adalah tombol2 return inputEvent.button1_mask; if (tombol == mouseEvent.button3) // Kunci kanan return inputEvent.button3_mask; kembali -100; }Seluruh program berakhir di sini. Program di atas tidak menerapkan enkapsulasi benang manusia robot. Kode lengkap yang dapat digunakan dapat diunduh dari sumber daya situs berikut: http://xiazai.vevb.com/201608/yuanma/java-romotecontrol(vevb.com).rar
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.