程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java完成屏幕同享功效實例剖析

java完成屏幕同享功效實例剖析

編輯:關於JAVA

java完成屏幕同享功效實例剖析。本站提示廣大學習愛好者:(java完成屏幕同享功效實例剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是java完成屏幕同享功效實例剖析正文


本文實例講述了java完成屏幕同享功效的辦法。分享給年夜家供年夜家參考。詳細剖析以下:

比來在做軟件軟件工程的課程設計,做一個用於試驗室的屏幕監控體系,參考各類後人代碼,最初融會以後要轉換本身的代碼,初學者都是如許模擬過去的。

說到屏幕監控體系,有教員端和先生端,教員端就是Server端,先生端就做Client端。體系裡比擬風趣的一個處所應當算是屏幕播送與屏幕監控吧,其他甚麼點名簽到,鎖屏,准時關機的,就絕對來講簡略點。

屏幕播送,在功效完成下面,說白了,就是教員真個機械赓續截取屏幕信息,以圖片的情勢發送到每個先生真個電腦下面,由此先生可以或許看見先生在電腦上的操作,這就是所謂的屏幕播送。

這外面有個費事的處所,就是截取屏幕圖片的時刻,是沒有鼠標信息。不外有兩種處理方法:

①在發送截圖信息時,在圖片上繪制一個鼠標,如許在先生端就會有兩個鼠標,先生端可以挪動本身電腦上的鼠標。

②發送教員真個鼠標坐標到先生端上,先生真個電腦鼠標依據坐標信息及時挪動,這裡實際上是觸及到掌握的功效了,先生端就不克不及挪動鼠標了。

屏幕監控絕對辣手點,其實這是這包括倆功效:
①教員監控一切先生電腦屏幕的功效;
②教員掌握某一個先生的電腦;
由於觸及到並發,每一個client都要及時的把屏幕信息發到教員端上,會有點費事,不外照樣可以完成。

這裡臨時完成了不帶鼠標的屏幕同享功效,比擬簡略,有待完美,不外可以作為一個對象類在前面集成應用。

起首是教員端Server:
package Test;
 
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
 
import javax.imageio.ImageIO;
 
/*
 * ly  2014-11-20
 * 該類及時發送截屏消逝,多線程完成,不包括鼠標信息,且沒有做對每一個Client做優化處置
 */
public  class SendScreenImg extends Thread
{
    public static int SERVERPORT=8000;
    private ServerSocket serverSocket;
    private Robot robot;
    public  Dimension screen;
    public Rectangle rect ;
    private Socket socket;
    
    public static void main(String args[])
    {
        new SendScreenImg(SERVERPORT).start();
    }
    
    //結構辦法  開啟套接字銜接      機械人robot   獲得屏幕年夜小
    public SendScreenImg(int SERVERPORT)
    {
        try {
            serverSocket = new ServerSocket(SERVERPORT);
            serverSocket.setSoTimeout(864000000);
            robot = new Robot();
        } catch (Exception e) {
            e.printStackTrace();
        }
        screen = Toolkit.getDefaultToolkit().getScreenSize();  //獲得主屏幕的年夜小
        rect = new Rectangle(screen);                          //結構屏幕年夜小的矩形
    }
    
    @Override
    public void run()
    {
        //及時期待吸收截屏新聞
        while(true)
        {
            try{
                socket = serverSocket.accept();
                System.out.println("先生端口曾經銜接");
                ZipOutputStream zip = new ZipOutputStream(new DataOutputStream(socket.getOutputStream()));
                zip.setLevel(9);     //設置緊縮級別
                
                BufferedImage img = robot.createScreenCapture(rect);
                zip.putNextEntry(new ZipEntry("test.jpg"));
                ImageIO.write(img, "jpg", zip);
                if(zip!=null)zip.close();
                System.out.println("Client正在及時銜接");
               
            } catch (IOException ioe) {
                System.out.println("銜接斷開");
            } finally {
                if (socket != null) {
                    try {
                        socket.close();
                    } catch (IOException e) {e.printStackTrace();}
                }
            }
        }
    }
}

然後是先生端Client:
package Test;
import java.awt.Frame;
import java.awt.Image;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.concurrent.TimeUnit;
import java.util.zip.ZipInputStream;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
/*
 * ly  2014-11-20
 * 該類用於吸收教員真個屏幕信息,不包含鼠標,待優化
 */
public  class ReceiveImages extends  Thread{
    public BorderInit frame ;
    public Socket socket;
    public String IP;
    
    public static void main(String[] args){
        new ReceiveImages(new BorderInit(), "127.0.0.1").start();
    }
    public ReceiveImages(BorderInit frame,String IP)
    {
        this.frame = frame;
        this.IP=IP;
    }
    
    public void run() {
        while(frame.getFlag()){
            try {
                socket = new Socket(IP,8000);
                DataInputStream ImgInput = new DataInputStream(socket.getInputStream());
                ZipInputStream imgZip = new ZipInputStream(ImgInput);
                
                imgZip.getNextEntry();             //到Zip文件流的開端處
                Image img = ImageIO.read(imgZip);  //依照字節讀取Zip圖片流外面的圖片
                frame.jlbImg.setIcon(new ImageIcon(img));
                System.out.println("銜接第"+(System.currentTimeMillis()/1000)%24%60+"秒");
                frame.validate();
                TimeUnit.MILLISECONDS.sleep(50);// 吸收圖片距離時光
                imgZip.close();
                
            } catch (IOException | InterruptedException e) {
                System.out.println("銜接斷開");
            }finally{
                try {
                    socket.close();
                } catch (IOException e) {} 
            }      
        }  
    }
}
 
//Client端窗口幫助類,專門用來顯示從教員端收到的屏幕信息
class BorderInit extends JFrame
{
    private static final long serialVersionUID = 1L;
    public JLabel jlbImg;
    private boolean flag;
    public boolean getFlag(){
        return this.flag;
    }
    public BorderInit()
    {
        this.flag=true;
        this.jlbImg = new JLabel();
        this.setTitle("長途監控--IP:"  + "--主題:" );
        this.setSize(400, 400);
        //this.setUndecorated(true);  //全屏顯示,測試時最好正文失落
        //this.setAlwaysOnTop(true);  //顯示窗口一直在最後面
        this.add(jlbImg);
        this.setLocationRelativeTo(null);
        this.setExtendedState(Frame.MAXIMIZED_BOTH);
        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        this.setVisible(true);
        this.validate();
    
        //窗口封閉事宜
        this.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                flag=false;
                BorderInit.this.dispose();
                System.out.println("窗體封閉");
                System.gc();    //渣滓收受接管
            }
        });
    }
}

這裡就從未制品中抽取了這麼個小功效,間隔制品還有許多要寫,感興致的同伙可以在此基本上加以完美。

願望本文所述對年夜家的Java法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved