Пример в этой статье описывает, как Java реализует трансляцию экрана с помощью управления мышью. Поделитесь этим со всеми для справки. Конкретный анализ заключается в следующем:
В предыдущей статье «Разбор примеров реализации функции совместного использования экрана в Java» упоминалось, что при захвате экрана нет мыши. Чтобы увидеть мышь в интерфейсе учителя, вы можете приводить мышь к каждому скриншоту. Однако, поскольку снимки экрана делаются один за другим, мышь, которую вы видите, неизбежно будет немного застревать. Ранее я написал Java-апплет управления мышью, и вы можете увидеть демонстрацию мыши таким образом.
Метод реализации также довольно прост. В предыдущих двух статьях функции управления мышью и совместного использования экрана были реализованы без мыши соответственно. Давайте кратко проанализируем их ниже.
На стороне сервера SendScreenImg и SendMouseMessage рассматриваются как два класса инструментов, прослушивающие разные порты соответственно. Оба они реализуют класс Thread, и для управления ими мы используем класс пула потоков ExecutorService.
Используются два порта, потому что я еще не знаю, как отправить информацию о мыши и информацию об изображении вместе. Возможно, я смогу преобразовать изображение в массив байтов и поместить координаты мыши перед массивом, но в этом случае. мышь может и не будет. Это будет бессвязно, потому что скорость передачи координат мыши будет быстрее, чем передача картинки. Ну попробуйте еще раз, когда будет время.
Аналогия с клиентом аналогична приведенной выше.
Вот код:
Сервер:
Основная программа:
Скопируйте код кода следующим образом:/*
* Класс трансляции экрана вызывает два класса инструментов: класс для отправки информации о скриншоте и класс для отправки информации о мыши с использованием пула потоков.
*/
публичный класс BroderCast {
public static void main(String[] args)
{
новый BroderCast();
System.out.println("Начать");
}
публичный BroderCast()
{
Экзектор ExecutorService = Executors.newFixedThreadPool(2);
exector.execute(новый SendScreenImg());
exector.execute(новый SendMouseMessage());
}
}
Отправить скриншот кода:
Скопируйте код следующим образом: import 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;
/*
* Инструменты: отправка информации о снимке экрана со стороны учителя на сторону ученика. Информация о мыши отсутствует, используется порт 8002.
* Информацию о мыши можно отобразить на компоненте отправленного изображения, чтобы информацию о мыши можно было увидеть в интерфейсе ученика. Эта функция еще не реализована.
*
*/
публичный класс SendScreenImg расширяет поток
{
общественный int serverPort = 8002;
частный ServerSocket serverSocket;
частный робот-робот;
экран общественного измерения;
общественный прямоугольник rect;
частная розетка;
public static void main(String args[])
{
новый SendScreenImg().start();
}
public voidchangeServerPort(int serverPort)
{
if(this.serverPort == serverPort) return;
пытаться{
this.serverSocket.close(); //Необходимо сначала закрыть текущий порт
this.serverPort = serverPort;
serverSocket = новый ServerSocket(this.serverPort);
serverSocket.setSoTimeout(8000000);
}catch(Исключение е){}
}
//Метод построения для открытия робота подключения сокета и получения размера экрана
общедоступный SendScreenImg()
{
пытаться {
serverSocket = новый ServerSocket (getServerPort());
serverSocket.setSoTimeout(864000000);
робот = новый робот();
} catch (Исключение е) {
е.printStackTrace();
}
screen = Toolkit.getDefaultToolkit().getScreenSize(); //Получаем размер главного экрана
rect = new Rectangle(screen); //Создаем прямоугольник соответствующего размера
}
@Override
публичный недействительный запуск()
{
//Ожидание в реальном времени получения сообщений со скриншотами
в то время как (правда) {
пытаться {
сокет = serverSocket.accept();
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 ioe) {
System.out.println("Ошибка подключения");
} окончательно {
если (сокет!= ноль) {
пытаться {
сокет.закрыть();
} catch (IOException e) {
}
}
}
}
}
}
Отправить информацию о мыши:
Скопируйте код кода следующим образом:/*
* Класс инструментов: получить информацию о мыши и отправить ее на терминал ученика.
*/
общественный класс SendMouseMessage расширяет Thread {
частный интервал OPERATE_PORT = 8001;
частный сервер ServerSocket;
частная розетка;
частная строкаoperStr;
public static void main(String[] args)
{
новый SendMouseMessage().start();
}
общественный SendMouseMessage () {
пытаться {
сервер = новый ServerSocket (OPERATE_PORT);
//JOptionPane.showMessageDialog(null, «начал прослушивание»);
} поймать (IOException e1) {
e1.printStackTrace();
}
}
//Несколько потоков контролируют клиента в беспроводном цикле
публичный недействительный запуск()
{
в то время как (правда) {
Точка точки = MouseInfo.getPointerInfo().getLocation();
оперироватьStr = "Переместить мышь,"+point.x+","+point.y;
пытаться {
сокет = server.accept();
сокет.setSoTimeout(1000000);
Выход DataOutputStream = новый DataOutputStream(socket.getOutputStream());
output.write(operateStr.getBytes());
output.flush(); //Очищаем выходной поток и записываем все буферизованные выходные байты
output.close(); //Закрываем поток вывода и освобождаем ресурсы
System.out.println("ИНФОРМАЦИЯ: "+operateStr);
} catch (IOException e) {
System.out.println("Соединение остановлено");
перерыв //Остановка беспроводного цикла при отключении;
}
}
}
}
Клиент:
Основная программа:
Скопируйте код следующим образом: import java.util.concurrent.ExecutorService;
импортировать java.util.concurrent.Executors;
импортировать com.Tool.OperateMouse;
импортировать com.Tool.ReceiveImages;
общественный класс ReceiveBroderCast {
общедоступный исполнитель ExecutorService;
общедоступная статическая строка IP="202.216.60.9";
public static void main(String[] args)
{
новый ReceiveBroderCast (IP);
}
public ReceiveBroderCast (String IP) {
исполнитель = Executors.newFixedThreadPool(2);
exector.execute(новый ReceiveImages(IP));
exector.execute(новый OperateMouse(IP));
}
}
Получите код скриншота:
Скопируйте код кода следующим образом:/*
* 20 ноября 2014 г.
* Этот класс используется для получения экранной информации со стороны учителя, за исключением мыши.
* Используйте сокет()
*/
публичный класс ReceiveImages расширяет Thread{
общедоступный кадр BorderInit;
общедоступная розетка;
общедоступный строковый IP-адрес;
public static void main(String[] args){
новый ReceiveImages("202.216.60.7").start();
}
publicReceiveImages (строка IP)
{
рамка = новый BorderInit ();
это.IP=IP;
}
общественный недействительный запуск () {
в то время как (frame.getFlag()) {
System.out.println("Подключено"+(System.currentTimeMillis()/1000)%24%60+"секунд");
пытаться {
сокет = новый сокет (IP,8002);
DataInputStream ImgInput = новый DataInputStream(socket.getInputStream());
ZipInputStream imgZip = новый ZipInputStream (ImgInput);
Изображение img = ноль;
пытаться{
imgZip.getNextEntry(); //Переходим к началу потока Zip-файла.
img = ImageIO.read(imgZip); //Чтение изображений в потоке изображений Zip в соответствии с байтами
Frame.jlbImg.setIcon(новый ImageIcon(img));
кадр.валидате();
}catch (IOException e) {e.printStackTrace();}
пытаться{
imgZip.закрыть();
} catch (IOException e) {
System.out.println("Соединение разорвано");
}
пытаться {
TimeUnit.MILLISECONDS.sleep(50);//Интервал приема картинок
} catch (InterruptedException т.е.) {
т.е.printStackTrace();
}
} catch (IOException e) {
е.printStackTrace();
}окончательно{
пытаться {
сокет.закрыть();
} 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(); //сборка мусора
}
});
}
}
Получайте информацию о мыши и управляйте движением мыши:
Скопируйте код следующим образом: import java.awt.AWTException;
импортировать java.awt.Robot;
импортировать java.io.BufferedInputStream;
импортировать java.io.BufferedReader;
импортировать java.io.DataInputStream;
импортировать java.io.IOException;
импортировать java.io.InputStream;
импортировать java.net.Socket;
импортировать javax.swing.JOptionPane;
/*
* Управление мышью на стороне ученика такое же, как и на стороне учителя.
* Этот класс отвечает за получение информации о мыши и управление движением мыши с помощью функции robot.mouseMove().
*/
публичный класс OperateMouse расширяет Thread{
public static void main(String[] args)
{
новый OperateMouse("202.116.60.7").start();
}
частная розетка;
общедоступный строковый IP-адрес;
частный интервал OPERATE_PORT = 8001;
частный робот-робот;
общественный OperateMouse (строковый IP)
{
this.IP = IP;
}
общественный недействительный запуск () {
в то время как (правда) {
пытаться {
сокет = новый сокет (IP, OPERATE_PORT);
робот = новый робот();
//Получаем информацию о движении мыши
DataInputStream dataIn = новый DataInputStream(socket.getInputStream());
Строковая информация="";
интервал р;
while((r=dataIn.read()) != -1){
info +=""+(char)r //Преобразуем все элементы массива байтов в символьный тип
}
данныеВ.закрыть();
System.out.println("Поток данных отключен"+info);
если (информация! = ноль) {
String s[] = info.trim().split(",");
if("Movemouse".equals(s[0].trim()));
{
если (с. длина == 3) {
int x = Integer.parseInt(s[1].trim());
int y = Integer.parseInt(s[2].trim());
System.out.println("Вывести информацию о мыши"+x+" "+ y);
robot.mouseMove(x, y);
}
}
}
} catch (IOException e) {
System.out.println("Отключено");
перерыв;
} catch (AWTException e) {
е.printStackTrace();
}
}
}
}
Я надеюсь, что эта статья будет полезна каждому, кто занимается программированием на Java.