Пример в этой статье описывает, как реализовать функцию совместного использования экрана в Java. Поделитесь этим со всеми для справки. Конкретный анализ заключается в следующем:
Недавно я разрабатываю курс по разработке программного обеспечения, делаю систему мониторинга экрана для лаборатории, обращаюсь к различным кодам предшественников и, наконец, конвертирую свой собственный код после его понимания. Вот как его имитируют новички.
Когда дело доходит до системы мониторинга экрана, есть сторона учителя и сторона ученика. Сторона учителя — это сторона сервера, а сторона ученика — это сторона клиента. Одним из наиболее интересных аспектов системы, вероятно, является трансляция экрана и мониторинг экрана. Остальные операции по перекличке, блокировке экрана и запланированному выключению относительно просты.
Трансляция экрана, с точки зрения реализации функции, если говорить прямо, заключается в том, что машина преподавателя непрерывно перехватывает экранную информацию и отправляет ее на компьютер каждого ученика в виде картинок, чтобы ученики могли видеть действия учителя на компьютере. так называемая экранная трансляция.
Здесь есть неприятная вещь, то есть при создании скриншота экрана нет информации о мыши. Но есть два решения:
① При отправке информации о снимке экрана нарисуйте мышь на изображении, чтобы на стороне учащегося было две мыши, и учащийся мог перемещать мышь на своем компьютере.
②Отправьте координаты мыши со стороны учителя на сторону ученика, и компьютерная мышь ученика будет перемещаться в реальном времени в соответствии с информацией о координатах. На самом деле это включает в себя функцию управления, и сторона ученика не может перемещать мышь.
Мониторинг экрана относительно сложен. Фактически он содержит две функции:
①Учитель может контролировать экраны компьютеров всех учеников;
②Учитель управляет компьютером ученика;
Поскольку это предполагает параллелизм, каждый клиент должен отправлять информацию с экрана преподавателю в режиме реального времени, что будет немного хлопотно, но этого все же можно достичь.
Здесь временно реализована функция совместного использования экрана без мыши. Она относительно проста и нуждается в доработке, но ее можно использовать как класс инструмента для интеграции в дальнейшем.
Первый — это учительский сервер:
Скопируйте код следующим образом: package Test;
импортировать java.awt.Dimension;
импортировать java.awt.Rectangle;
импортировать java.awt.Robot;
импортировать java.awt.Toolkit;
импортировать java.awt.image.BufferedImage;
импортировать java.io.DataOutputStream;
импортировать java.io.IOException;
импортировать java.net.ServerSocket;
импортировать java.net.Socket;
импортировать java.util.zip.ZipEntry;
импортировать java.util.zip.ZipOutputStream;
импортировать javax.imageio.ImageIO;
/*
* 20 ноября 2014 г.
* Этот тип отправки скриншотов в реальном времени исчезает, многопоточная реализация не включает информацию о мыши и не оптимизирует каждый Клиент.
*/
публичный класс SendScreenImg расширяет поток
{
public static int SERVERPORT=8000;
частный ServerSocket serverSocket;
частный робот-робот;
экран общественного измерения;
общественный прямоугольник rect;
частная розетка;
public static void main(String args[])
{
новый SendScreenImg(SERVERPORT).start();
}
//Метод построения для открытия робота подключения сокета и получения размера экрана
общедоступный SendScreenImg (int SERVERPORT)
{
пытаться {
serverSocket = новый ServerSocket (SERVERPORT);
serverSocket.setSoTimeout(864000000);
робот = новый робот();
} catch (Исключение е) {
е.printStackTrace();
}
screen = Toolkit.getDefaultToolkit().getScreenSize(); //Получаем размер главного экрана
rect = new Rectangle(screen); //Создаем прямоугольник размером с экран.
}
@Override
публичный недействительный запуск()
{
//Ожидание в реальном времени получения сообщений со скриншотами
пока (правда)
{
пытаться{
сокет = serverSocket.accept();
System.out.println("Студенческий порт подключен");
ZipOutputStream zip = новый ZipOutputStream (новый DataOutputStream (socket.getOutputStream ()));
zip.setLevel(9); //Установим уровень сжатия
BufferedImage img = robot.createScreenCapture(rect);
zip.putNextEntry(новый ZipEntry("test.jpg"));
ImageIO.write(img, "jpg", zip);
если(zip!=null)zip.close();
System.out.println("Клиент подключается в режиме реального времени");
} catch (IOException ioe) {
System.out.println("Соединение разорвано");
} окончательно {
если (сокет!= ноль) {
пытаться {
сокет.закрыть();
} catch (IOException e) {e.printStackTrace();}
}
}
}
}
}
Еще есть студенческий клиент:
Скопируйте код следующим образом: package Test;
импортировать java.awt.Frame;
импортировать java.awt.Image;
импортировать java.awt.event.WindowAdapter;
импортировать java.awt.event.WindowEvent;
импортировать java.io.DataInputStream;
импортировать java.io.IOException;
импортировать java.net.Socket;
импортировать java.util.concurrent.TimeUnit;
импортировать java.util.zip.ZipInputStream;
импортировать javax.imageio.ImageIO;
импортировать javax.swing.ImageIcon;
импортировать javax.swing.JFrame;
импортировать javax.swing.JLabel;
/*
* 20 ноября 2014 г.
* Этот класс используется для получения экранной информации со стороны учителя, за исключением мыши, и его необходимо оптимизировать.
*/
публичный класс ReceiveImages расширяет Thread{
общедоступный кадр BorderInit;
общедоступная розетка;
общедоступный строковый IP-адрес;
public static void main(String[] args){
новые ReceiveImages(новый BorderInit(), "127.0.0.1").start();
}
public ReceiveImages (кадр BorderInit, строка IP)
{
this.frame = кадр;
это.IP=IP;
}
общественный недействительный запуск () {
в то время как (frame.getFlag()) {
пытаться {
сокет = новый сокет (IP,8000);
DataInputStream ImgInput = новый DataInputStream(socket.getInputStream());
ZipInputStream imgZip = новый ZipInputStream (ImgInput);
imgZip.getNextEntry(); //Переходим к началу потока Zip-файла.
Image img = ImageIO.read(imgZip); //Чтение изображений в потоке изображений Zip в соответствии с байтами
Frame.jlbImg.setIcon(новый ImageIcon(img));
System.out.println("Номер соединения"+(System.currentTimeMillis()/1000)%24%60+"секунды");
кадр.валидате();
TimeUnit.MILLISECONDS.sleep(50);//Интервал приема картинок
imgZip.закрыть();
} catch (IOException | InterruptedException e) {
System.out.println("Соединение разорвано");
}окончательно{
пытаться {
сокет.закрыть();
} catch (IOException e) {}
}
}
}
}
//Вспомогательный класс окна на стороне клиента, специально используемый для отображения информации на экране, полученной от учителя
класс BorderInit расширяет JFrame
{
частный статический окончательный длинный сериалVersionUID = 1L;
общественный JLabel jlbImg;
частный логический флаг;
общедоступное логическое значение getFlag(){
вернуть этот.флаг;
}
publicBorderInit()
{
this.flag=истина;
this.jlbImg = новый JLabel();
this.setTitle("Удаленный мониторинг --IP:" + "--Topic:" );
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(истина);
это.валидате();
//событие закрытия окна
this.addWindowListener(новый WindowAdapter() {
public void windowClosing(WindowEvent e) {
флаг = ложь;
BorderInit.this.dispose();
System.out.println("Форма закрыта");
System.gc(); //сборка мусора
}
});
}
}
Вот такая маленькая функция, извлеченная из незаконченного продукта. Еще многое нужно написать, прежде чем заинтересованные друзья смогут улучшить его на этой основе.
Я надеюсь, что эта статья будет полезна каждому, кто занимается программированием на Java.