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(); //
}
});
}
}
여기 서 완제품 에서 이런 작은 기능 을 추출 한 적 이 없고 완제품 까지 쓸 것 이 많 으 며 관심 이 있 는 친 구 는 이 를 바탕 으로 보완 할 수 있다.
본 고 에서 말 한 것 이 여러분 의 자바 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.