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法式設計有所贊助。