java 화면 공유 기능 실례 분석 실현

본 고 는 자바 가 화면 공유 기능 을 실현 하 는 방법 을 실례 로 서술 하 였 다.모두 에 게 참고 하도록 공유 하 다.구체 적 인 분석 은 다음 과 같다.
최근 에 소프트웨어 소프트웨어 공학 의 과정 설 계 를 하고 실험실 에 사용 되 는 스크린 모니터링 시스템 을 만 들 었 습 니 다. 각종 선행 코드 를 참고 하여 마지막 으로 깨 달 은 후에 자신의 코드 를 바 꿔 야 합 니 다. 초보 자 들 은 모두 이렇게 모방 해 왔 습 니 다.
스크린 모니터링 시스템 하면 교사 단 과 학생 단 이 있 고 교사 단 은 Server 단 이 며 학생 단 은 Client 단 이 됩 니 다.시스템 에서 비교적 재 미 있 는 곳 은 스크린 방송 과 스크린 모니터링 이 라 고 할 수 있 습 니 다. 나머지 출석 체크, 잠 금 화면, 정시 에 꺼 진 것 은 상대 적 으로 간단 합 니 다.
스크린 방송 은 기능 실현 에 있어 서 말하자면 교사 측의 기계 가 스크린 정 보 를 계속 캡 처 하고 그림 의 형식 으로 모든 학생 단의 컴퓨터 에 보 내 는 것 이다. 이 를 통 해 학생 들 은 선생님 이 컴퓨터 에서 조작 하 는 것 을 볼 수 있다. 이것 이 바로 스크린 방송 이다.
이 안 에는 화면 사진 을 캡 처 할 때 마우스 정보 가 없 는 번 거 로 운 점 이 있다.하지만 두 가지 해결 방법 이 있다.
① 캡 처 메 시 지 를 보 낼 때 그림 에 마 우 스 를 그리 면 학생 단 에 마우스 가 두 개 있 고 학생 단 에 서 는 자신의 컴퓨터 에 있 는 마 우 스 를 움 직 일 수 있다.
② 교사 단 에 있 는 마우스 좌 표를 학생 단 에 보 내 고 학생 단의 컴퓨터 마 우 스 는 좌표 정보 에 따라 실시 간 으로 이동 하 는데 여 기 는 통제 기능 과 관련 된 것 이기 때문에 학생 단 에 서 는 마 우 스 를 이동 할 수 없다.
스크린 모니터링 은 상대 적 으로 까다 로 운 점 이다. 사실은 이것 은 두 가지 기능 을 포함한다. ① 교사 가 모든 학생 들 의 컴퓨터 스크린 을 감시 하 는 기능 이다.② 교사 가 한 학생 의 컴퓨터 를 제어 한다.동시 다발 과 관련 되 기 때문에 모든 client 는 실시 간 으로 화면 정 보 를 교사 에 게 보 내야 하기 때문에 좀 번 거 롭 지만 실현 할 수 있 습 니 다.
마 우 스 를 끼 지 않 은 화면 공유 기능 을 잠시 실현 하 였 으 며, 비교적 간단 하고 보완 되 어야 하 며, 도구 류 로 서 뒤에서 통합 적 으로 사용 할 수 있다.
우선 교사 단 서버:

   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();}
                }
            }
        }
    }
}

그리고 학생 단 클 라 이언 트:

   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();    //
            }
        });
    }
}

여기 서 완제품 에서 이런 작은 기능 을 추출 한 적 이 없고 완제품 까지 쓸 것 이 많 으 며 관심 이 있 는 친 구 는 이 를 바탕 으로 보완 할 수 있다.
본 고 에서 말 한 것 이 여러분 의 자바 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기