Java小項目之遠程桌面顯示(摘自藍橋老師視屏)


  主要是使用了一個Socket套接字,還有輸入流輸出流,多線程,還有一些其他的。看完就記得老師說過人對動畫的感知再0.065秒,覺得編程最有意思的莫過於那種掌控全局的感覺。有點跑偏,繼續說用到的東西。

  主要用的是網絡編程吧,其實都是很基礎的東西,自己來手寫代碼能理解更多。都是常用到的東西。直接貼代碼吧,下一個我會進行自己的修改。

Client類:

 1 package com.rookie.screen;
 2 
 3 import java.awt.Dimension;
 4 import java.awt.FlowLayout;
 5 import java.io.DataInputStream;
 6 import java.net.Socket;
 7 
 8 import javax.swing.ImageIcon;
 9 import javax.swing.JFrame;
10 import javax.swing.JLabel;
11 import javax.swing.JPanel;
12 import javax.swing.JScrollPane;
13 
14 public class Client {
15 
16     public static void main(String[] args) {
17         String host = "127.0.0.1";
18         String post = "16000";
19         
20         try {
21             Socket client = new Socket(host, Integer.parseInt(post));
22             DataInputStream dis = new DataInputStream(client.getInputStream());
23             
24             //界面
25             JFrame jFrame = new JFrame("桌面監視");
26             jFrame.setSize(1024, 768);
27             jFrame.setLocationRelativeTo(null);
28             jFrame.setLayout(new FlowLayout());
29             
30             jFrame.setAlwaysOnTop(true);
31             jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
32             
33             //讀取分辨率
34             double height = dis.readDouble();
35             double width = dis.readDouble();
36             
37             Dimension ds = new Dimension((int)width, (int)height);
38             
39             jFrame.setSize(ds);
40             
41             JLabel backImage = new JLabel();
42             JPanel panel = new JPanel();
43             //滾動條
44             JScrollPane jp = new JScrollPane(panel);
45             panel.setLayout(new FlowLayout());
46             panel.add(backImage);
47             //設置窗口可見。
48             jFrame.add(panel);
49             jFrame.setVisible(true);
50             
51             while(true) {
52                 int len = dis.readInt();
53                 byte[] data = new byte[len];
54                 dis.readFully(data);
55                 ImageIcon imageIcon = new ImageIcon(data);
56                 backImage.setIcon(imageIcon);
57                 //重新繪制面板。
58                 jFrame.repaint();
59             }
60             
61         } catch (Exception e) {
62             // TODO Auto-generated catch block
63             e.printStackTrace();
64         }
65         
66         
67         
68     }
69     
70     
71 }

Server類:

 1 package com.rookie.screen;
 2 /**
 3  * 
 4  * @author RookieSa
 5  *
 6  */
 7 
 8 import java.awt.Dimension;
 9 import java.awt.Rectangle;
10 import java.awt.Robot;
11 import java.awt.Toolkit;
12 import java.awt.image.BufferedImage;
13 import java.io.ByteArrayOutputStream;
14 import java.io.DataOutputStream;
15 import java.io.OutputStream;
16 import java.net.ServerSocket;
17 import java.net.Socket;
18 
19 import com.sun.image.codec.jpeg.JPEGCodec;
20 import com.sun.image.codec.jpeg.JPEGImageEncoder;
21 
22 
23 public class Server {
24     //建立服務器的監聽
25     public static void main(String[] args) {
26         try {
27             ServerSocket ss = new ServerSocket(16000);
28             System.out.println("正在連接服務器>>>>>>");
29             //等待連接
30             Socket client = ss.accept();
31             //服務器連接成功
32             System.out.println("服務器連接成功>>>>>>");
33             //獲取輸出流
34             OutputStream os = client.getOutputStream();
35             //二進制文件
36             DataOutputStream dos = new DataOutputStream(os);
37             //使用多線程傳輸
38             SreenThread st = new SreenThread(dos);
39             st.start();
40         }catch(Exception e){
41             e.printStackTrace();
42         }
43     }
44 
45 }
46 
47 class SreenThread extends Thread{
48     //數據輸出流
49     DataOutputStream dataOut;
50     
51     public SreenThread(DataOutputStream dataOut) {
52         this.dataOut = dataOut;
53     }
54     
55     public void run() {
56         Toolkit tk = Toolkit.getDefaultToolkit();
57         Dimension dm =tk.getScreenSize();
58         
59         //獲取屏幕分辨率,發送
60         try {
61             dataOut.writeDouble(dm.getHeight());
62             dataOut.writeDouble(dm.getWidth());
63             //刷新內存
64             dataOut.flush();
65             
66             //定義一個矩形
67             Rectangle rc = new Rectangle(dm);
68             
69             //定義一個機器人
70             Robot robot = new Robot();
71             
72             while(true) {
73                 BufferedImage bufferedImage = robot.createScreenCapture(rc);
74                 ByteArrayOutputStream baos = new ByteArrayOutputStream();
75                 
76                 //圖像壓縮處理
77                 JPEGImageEncoder jEncoder = JPEGCodec.createJPEGEncoder(baos);
78                 jEncoder.encode(bufferedImage);
79                 
80                 byte[] data = baos.toByteArray();
81                 //不停輸出
82                 dataOut.writeInt(data.length);
83                 dataOut.write(data);
84                 dataOut.flush();
85                 Thread.sleep(0);
86             }
87         } catch (Exception e) {
88             // TODO Auto-generated catch block
89             e.printStackTrace();
90         }
91     }
92 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM