이 기사의 예에서는 Java에서 화면 공유 기능을 구현하는 방법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.
최근에는 소프트웨어공학과목을 설계하고 연구실용 화면 모니터링 시스템을 제작하고 다양한 선행코드를 참고하여 최종적으로 이해한 후 직접 코드를 변환하는 방법을 초보자들이 따라하는 방법입니다.
화면 모니터링 시스템에는 교사 측과 학생 측이 있으며, 교사 측은 서버 측이고 학생 측은 클라이언트 측입니다. 시스템의 가장 흥미로운 측면 중 하나는 아마도 화면 방송 및 화면 모니터링일 것입니다. 나머지 출석 호출, 화면 잠금 및 예약된 종료는 비교적 간단합니다.
화면 방송은 기능 구현 측면에서 직설적으로 말하면 교사의 기계가 화면 정보를 지속적으로 가로채어 각 학생의 컴퓨터에 사진 형태로 전송하여 학생들이 컴퓨터에서 교사의 작업을 볼 수 있도록 하는 것입니다. 일명 스크린 방송.
여기서 귀찮은 점이 있는데, 바로 화면을 캡쳐할 때 마우스 정보가 없다는 것입니다. 하지만 두 가지 해결책이 있습니다.
① 스크린샷 정보 전송 시, 학생 측에 마우스 2개가 생기고, 학생 측에서는 자신의 컴퓨터에서 마우스를 움직일 수 있도록 사진 위에 마우스를 그려주세요.
②선생님 쪽의 마우스 좌표를 학생 쪽으로 보내면, 그 좌표 정보에 따라 학생의 컴퓨터 마우스가 실시간으로 움직입니다. 이는 실제로 제어 기능을 포함하며, 학생 쪽에서는 마우스를 움직일 수 없습니다.
화면 모니터링은 실제로 다음과 같은 두 가지 기능을 포함합니다.
①교사는 모든 학생의 컴퓨터 화면을 모니터링할 수 있습니다.
②교사는 학생의 컴퓨터를 제어합니다.
동시성이 필요하기 때문에 각 클라이언트는 실시간으로 교사에게 화면 정보를 보내야 하는데 이는 다소 번거롭지만 여전히 달성할 수 있습니다.
여기서는 마우스가 없는 화면 공유 기능을 임시로 구현했는데, 상대적으로 간단하고 개선이 필요하지만 나중에 통합을 위한 도구 클래스로 사용할 수 있습니다.
첫 번째는 교사 서버입니다.
다음과 같이 코드를 복사합니다. 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;
java.net.ServerSocket 가져오기;
java.net.Socket 가져오기;
java.util.zip.ZipEntry 가져오기;
java.util.zip.ZipOutputStream 가져오기;
javax.imageio.ImageIO 가져오기;
/*
* 2014-11-20
* 이러한 유형의 스크린샷 실시간 전송은 사라지고 멀티스레드 구현되며 마우스 정보가 포함되지 않으며 각 클라이언트를 최적화하지 않습니다.
*/
공개 클래스 SendScreenImg는 스레드를 확장합니다.
{
공개 정적 int SERVERPORT=8000;
개인 ServerSocket serverSocket;
개인용 로봇 로봇;
공개 차원 화면;
공개 직사각형 직사각형;
개인 소켓 소켓;
공개 정적 무효 메인(문자열 인수[])
{
새로운 SendScreenImg(SERVERPORT).start();
}
//소켓 연결 로봇을 오픈하고 화면 크기를 구하는 구성 방법
공개 SendScreenImg(int SERVERPORT)
{
노력하다 {
serverSocket = 새 서버소켓(SERVERPORT);
serverSocket.setSoTimeout(864000000);
로봇 = 새로운 로봇();
} 잡기(예외 e) {
e.printStackTrace();
}
screen = Toolkit.getDefaultToolkit().getScreenSize() //메인 화면의 크기를 가져옵니다.
ret = new Rectangle(screen); //화면 크기의 직사각형을 생성합니다.
}
@보수
공개 무효 실행()
{
//실시간으로 스크린샷 메시지 수신 대기
동안(사실)
{
노력하다{
소켓 = serverSocket.accept();
System.out.println("학생 포트가 연결되었습니다.");
ZipOutputStream zip = new ZipOutputStream(new DataOutputStream(socket.getOutputStream()));
zip.setLevel(9); //압축 수준 설정
BufferedImage img = 로봇.createScreenCapture(직사각형);
zip.putNextEntry(new ZipEntry("test.jpg"));
ImageIO.write(img, "jpg", zip);
if(zip!=null)zip.close();
System.out.println("클라이언트가 실시간으로 연결 중입니다.");
} 잡기(IOException ioe) {
System.out.println("연결이 끊어졌습니다.");
} 마지막으로 {
if (소켓 != null) {
노력하다 {
소켓.닫기();
} catch (IOException e) {e.printStackTrace();}
}
}
}
}
}
그런 다음 학생 클라이언트가 있습니다.
다음과 같이 코드를 복사합니다. package Test;
java.awt.Frame 가져오기;
java.awt.Image 가져오기;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.IOException;
java.net.Socket 가져오기;
import java.util.concurrent.TimeUnit;
java.util.zip.ZipInputStream 가져오기;
javax.imageio.ImageIO 가져오기;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
/*
* 2014-11-20
* 본 클래스는 마우스를 제외하고 선생님측에서 화면정보를 수신하는데 사용되는 클래스이므로 최적화가 필요합니다.
*/
공개 클래스 receiveImages는 스레드를 확장합니다{
공개 BorderInit 프레임;
공용 소켓 소켓;
공개 문자열 IP;
공개 정적 무효 메인(문자열[] 인수){
new receiveImages(new BorderInit(), "127.0.0.1").start();
}
공개 수신 이미지(BorderInit 프레임, 문자열 IP)
{
this.frame = 프레임;
this.IP=IP;
}
공개 무효 실행() {
while(frame.getFlag()){
노력하다 {
소켓 = 새 소켓(IP,8000);
DataInputStream ImgInput = new DataInputStream(socket.getInputStream());
ZipInputStream imgZip = new ZipInputStream(ImgInput);
imgZip.getNextEntry(); //Zip 파일 스트림의 시작 부분으로 이동
Image img = ImageIO.read(imgZip); //Zip 이미지 스트림의 이미지를 바이트 단위로 읽습니다.
프레임.jlbImg.setIcon(new ImageIcon(img));
System.out.println("연결 번호"+(System.currentTimeMillis()/1000)%24%60+"초");
프레임.유효화();
TimeUnit.MILLISECONDS.sleep(50);//사진 수신 간격 시간
imgZip.close();
} catch (IOException | InterruptedException e) {
System.out.println("연결이 끊어졌습니다.");
}마지막으로{
노력하다 {
소켓.닫기();
} 잡기(IOException e) {}
}
}
}
}
//클라이언트 측 창 보조 클래스, 교사 측에서 받은 화면 정보를 표시하는 데 특별히 사용됩니다.
BorderInit 클래스는 JFrame을 확장합니다.
{
개인 정적 최종 긴 serialVersionUID = 1L;
공개 JLabel jlbImg;
개인 부울 플래그;
공개 부울 getFlag(){
this.flag를 반환합니다.
}
공개BorderInit()
{
this.flag=true;
this.jlbImg = 새로운 JLabel();
this.setTitle("원격 모니터링--IP:" + "--주제:" );
this.setSize(400, 400);
//this.setUndesignated(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() {
공공 무효 windowClosing(WindowEvent e) {
플래그=거짓;
BorderInit.this.dispose();
System.out.println("양식이 닫혔습니다.");
System.gc(); //가비지 수집
}
});
}
}
완성되지 않은 제품에서 추출한 작은 기능은 다음과 같습니다. 관심 있는 친구는 이를 기반으로 개선할 수 있습니다.
이 글이 모든 사람의 Java 프로그래밍에 도움이 되기를 바랍니다.