Как мне написать свое собственное приложение для совместного использования рабочего стола в Java?
Здравствуйте, я хочу написать свое собственное приложение для обмена рабочим столом на Java.
Приложение должно иметь некоторые функции по умолчанию:
Сделать скриншот;
Разрешить удаленному подключенному пользователю нажимать / редактировать поля.
Я думал использовать класс Java Robot для движений мыши / нажатия клавиш. Проблема в том, что я не знаю, какую стратегию захвата экрана использовать.
Должен ли я делать последовательные снимки экрана (на хост-компьютере) каждую секунду и отправлять эти снимки с помощью UDP по сети, чтобы клиенты могли перехватывать грамм данных? Разве это не немного излишне для сети?
Какие еще стратегии доступны? (За исключением попытки уже существующего приложения).
PS: При необходимости я могу даже написать нативный код, используя JNI (все же это последнее, что я планирую сделать).
Позднее редактирование: после некоторого расследования я пришел к выводу @Thorbjørn Равн Андерсен. Java, вероятно, не лучший выбор для такого рода приложений. Я могу попытаться использовать JNI, но этот код покроет 75% моего проекта.
Я постараюсь найти другие альтернативы.
2 ответа
Внимательно посмотрите на проект Ultra VNC на SourceForge. Отличное место для начала.
В чистом Java вы не можете получить доступ к структурированной информации в системных окнах или отслеживать все соответствующие системные события, поэтому производительность синхронизации дисплея не будет оптимальной. Также существуют привилегированные окна, которые не принимают события мыши или клавиш от Robot. Удаленное потоковое видео не вариант!
С именованными ограничениями ваша попытка сRobot
класс действителен.Robot.createScreenCapture(Rectangle)
поместит раздел рабочего стола вBufferedImage
, который вы можете отправить в окно клиента. На стороне клиента вы можете захватывать события клавиатуры и мыши и отправлять их объекту Robot на стороне сервера.
Не зная фактического размера системных окон, имеет смысл работать с сеткой плиток рабочего стола:
- захваченные BufferedImage-ы тайлов могут поместиться в буфер протокола передачи.
- Период захвата может быть локально оптимизирован для тайлов с высокой энтропией (-> Стратегия захвата).
Дальнейшая минимизация трафика
- Учитывайте различия последующего содержимого рабочего стола, только
- Сжатие тайлов с помощью PNG или PCX-подобного метода
Для совместного использования через Интернет одноранговое соединение может быть установлено
- общедоступный прокси-сервер
- Пробивка отверстий UDP с обязательным общедоступным сервером-посредником для установления соединения
В любом случае протокол должен быть защищен, а доставка подтверждена.