Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Написание remote-desktop программы. С чего начать?


Автор: malor 8.6.2011, 17:00
[A]
Какие компоненты понадобятся? 
Просматривая темы форума можно найти совет использовать 
1) TIdTCPClient/TIdTCPServer.
2) TClientSocket/TServerSocket

Какой вариант правильней? Вообще, с клиентской части понадобится управлять тем, что происходит на удаленной машине.
Про сокеты такой материал нашел в сети:
http://mimicria.ru/2009/05/26/%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D0%BE%D0%B5-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5-%D1%81%D0%BE%D0%BA%D0%B5%D1%82%D1%8B/

Про использование TIdTCPClient/TIdTCPServer следующий:
http://www.cyberforum.ru/delphi-beginners/thread27765.html?uri=/delphi-beginners/thread27765.html
В ветке люди обсуждают создание программы, позволяющей просмотр удаленного рабочего стола, без активного участия просматривающего.

[B]
На серверной стороне должно производится формирование скриншотов с определенной периодичностью, для отсылки. Тут я сам выбираю интервал в долях секунды и вставляю его в код ServerSocket/TIdTCPServer? 

[C]
Вопрос передачи трафика большого объема пока отложим на самый конец. Возможно TightVNC будет необходимо изучать. Пока основную бы функциональность реализовать.

Какие еще важные шаги пропустил?
Если есть наработки, то прошу поделиться.

Автор: Snowy 8.6.2011, 20:27
[ A ]
на твой вкус. Я бы выбрал 1-й вариант - для меня он удобнее.
Есть еще варианты 3, 4, ..., N. Годится практически любой.
Вполне нормальный и вариант TClientSocket/TIdTCPServer.
Выбирай что тебе удобней и понятней.

[ B ]
Готового такого функционала нет.
Ты сам должен организовать промежутки между отправками.
Можно банально воткнуть sleep, либо вручную считать GetTickCount, чтобы получить более точные промежутки.
Sleep снизит нагрузку на систему, но не будет учитывать время на создание шотов, сжатие и отправку по сети, что будет давать разные интервалы на разных по мощности машинах.
Считать тики вручную - получишь более ровные интервалы, но выше нагрузку на систему.

[ C ]
Сделай основной блок, потом оптимизируй.
Например, необязательно слать полные скрины. Достаточно только ту часть, которая изменилась.

Что касается remote-desktop, то RDP устроен по другому принципу.

Автор: kami 9.6.2011, 12:54
[ A ]
Каждый кулик свое болото хвалит.
Я за TClient|TServerSocket - "мне с ними сухо и комфортно" smile

[ B ]
Если вопрос сокращения трафика откладываем в сторону (правильная мысль - посмотреть исходники VNC), то крайне желательно сделать передачу "скриншотов" через "обратную связь". Поясню:
каждому "скриншоту" при передаче присваивается идентификатор, после чего он отправляется клиенту.
Клиент, обработав "скриншот", отправляет идентификатор обратно.
Сервер получает идентификатор и вычисляет "а сколько же скриншотов сейчас висит между клиентом и сервером", т.е. сколько их уже сформировано и отправляется/ждет отправки. Если количество больше некоего критического (определять или опытным путем, или динамически), то формирование очередного скриншота нужно отложить, иначе - можно отправлять.
Если этого (или подобного, например - все вычисления "буферизации" проводить непосредственно на сервере) не сделать, то вполне возможна ситуация, которая была у меня в первых попытках реализации (передавал полный скриншот экрана) - на клиенте отображается всё великолепно, но - в замедленном темпе. И чем дальше - тем больше отставание. Попутно это приводило к увеличению потребления памяти на сервере и вылету через OutOfMemory. Приемлимый вариант (правда, будут заметны рывки) - пока не ушел полностью один скриншот, второй не начинать формировать.

Автор: malor 12.6.2011, 17:22
[ D ]
На клиентской машине отображается картинка удаленного рабочего стола в окошке произвольного размера, такого какого пользователь установит.
Допустим я кликаю в точку (100, 100) клиентской области в которую подгружено изображение стола.
Передаем серверной части, что произошёл удар мышью в определенной точке. По какому алгоритму  координаты точки на экране удаленной машины вычислять лучше?
Под рукой нет второго компа, чтоб под отладкой посмотреть механизм TightVNC. А запуск всего на одной машине приводит к эффекту "каскадных окон".

Автор: Akella 16.6.2011, 23:40
Может лучше взять готовый проект с исходниками, например ChunckVNC? Но там, наверняка на сях.

Автор: kami 16.6.2011, 23:56
Цитата(malor @  12.6.2011,  17:22 Найти цитируемый пост)
Передаем серверной части, что произошёл удар мышью в определенной точке. По какому алгоритму  координаты точки на экране удаленной машины вычислять лучше?

Если Вы воспользуетесь для воспроизведения удара мышкой http://msdn.microsoft.com/en-us/library/ms646260(v=vs.85).aspx или http://msdn.microsoft.com/en-us/library/ms646310(v=vs.85).aspx тогда так: обе они воспринимают "нормализованные" координаты мыши - от 0(лево или верх экрана) до 65535(право или низ экрана), вне зависимости от действительного разрешения.
Посему - функция "преобразования" будет выглядеть так:
Код

procedure T_____.TranslatePoint(var Point: TPoint);
begin
  Point.x := (65535 * Point.x) div Image1.Width;
  Point.y := (65535 * Point.y) div Image1.Height;
end;

где Image1 - TImage, на котором рисуется изображение удаленного компьютера.
Исходный Point - координаты клика на Image1.

Добавлено через 6 минут и 4 секунды
Кстати, передавать нужно не только клики мышью (в том числе - дополнительных клавиш мыши), но и прокрутку колеса, и движение мыши. Наглядный пример - перемещение курсора по контекстному меню, где идет 1 клик правой кнопкой для вызова меню, а потом - только перемещение курсора (включая вложенные меню) до нахождения нужного пункта.

Автор: Akella 17.6.2011, 10:54
Не забывайте про кодировки. Потому как в некоторых программах невозможно удалённо печатать текст на русском языке

Автор: yogin 4.7.2011, 22:25
Я писал свой удалённый администратор столов.

Вот что могу сказать:
1) использовал исключительно WinSockApi(для скорости). Формировал свои пакеты, чтобы была боле-мене оптимальная передача
2) использовал библиотеку ijl.dll(Intel JPEG Library) для быстрой скорости обработки графики(скриншот+его расчленение).

Вообщем внешне механика получилась как у радмина, но конечно скорость поменьше чутка, 
но на скорости 256 кб/с можно было печатать и т.п.

Ещё стоит упомянуть, что я писал трёхзвенную архитектуру (клиент-клиент) - (сервер) - (админ-клиент), 
где админ может управлять каким-либо клиентом в сети, а пакеты проходят через сервер.

Автор: Akella 12.7.2011, 23:03
Сейчас очень актуально использовать серверы типа IP-To-ID, типа как TeamViewer или ChunkVNC smile, что можно было к клиенту подключится минуя НАТ и сетевой экран.

Автор: Vitaly79 16.7.2011, 15:28
Удаленный доступ к вебкамере компьютера
Здраствуйте Мне нужна помощь  А точнее программа для удаленного доступа к вебкамере(аудио-видео) Шпионская скрытая программа которая не палится антивирусами....если можно помогите!
А также PHP скрипт для отправки анонимной почты на несколько адресов с вложением  
Связь со мной: lavrentyev2012@yandex.ru

Автор: kami 16.7.2011, 22:17
Цитата(Vitaly79 @  16.7.2011,  15:28 Найти цитируемый пост)
если можно помогите

не можно.

Автор: Anakin 27.9.2011, 14:27
Вот если кому понадобится исходники программы типа РАдмин.
Внутри есть папка с необходимыми компонентами.
Исходник не мой давным давно где то скачал его.

Автор: kami 28.9.2011, 07:21
Цитата(Anakin @  27.9.2011,  14:27 Найти цитируемый пост)
Исходник не мой давным давно где то скачал его.

Это мой исходник smile Одна из первых реализаций smile 

Автор: Anakin 28.9.2011, 12:05
))) Чесно не помню где достал его, это правдо было очень давно

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)