Написание собственного сервера и протокола совместного использования экрана

Я создаю клиент-серверное решение, которое должно иметь функцию совместного использования экрана. У меня что-то уже «работает», но проблема в том, что это работает только во внутренней сети, потому что моя методика недостаточно быстрая.

В основном я делаю то, что клиент делает запрос к серверу, запрашивая изображение экрана каждые 5 секунд (например). И это код, который обрабатывается после получения этого запроса:

private void GetImage(object networkstream)
{
    NetworkStream network = (NetworkStream)networkstream;

    Bitmap bitmap = new Bitmap(
        SystemInformation.PrimaryMonitorSize.Width,
        SystemInformation.PrimaryMonitorSize.Height);
    Graphics g = Graphics.FromImage(bitmap);
    g.CopyFromScreen(new Point(0, 0), new Point(0, 0), bitmap.Size);
    g.Flush();
    g.Dispose();

    MemoryStream ms = new MemoryStream();
    bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
    bitmap.Dispose();

    byte[] array = ms.ToArray();

    network.Write(array, 0, array.Length);
    network.Flush();

    ms.Dispose();
}
  1. Каковы лучшие методы сделать то, что я пытаюсь сделать? Мне нужно получить не менее 0,2 кадра в секунду (обновлять каждые 5 секунд) Замечания: Я использую Windows Forms, и это делается через сокеты.

  2. Как работают файлы TeamViwer и .rdp?


person Bruno Klein    schedule 12.02.2013    source источник
comment
Вы хотите воссоздать то, что уже делают RDP, VNC, Citrix?   -  person PinnyM    schedule 12.02.2013
comment
@PinnyM Да, но он хочет делать это очень медленно. Предположительно, он делится только презентациями PowerPoint;)   -  person RB.    schedule 12.02.2013
comment
Выглядит интересно, в Vista есть API: teknoportal.gen.tr /english/technology_news.asp?haber=385   -  person George Duckett    schedule 12.02.2013


Ответы (3)


Вы можете отправить только разницу между настоящим и последним изображением. Посмотрите здесь: Рассчитайте различия изображений в C #

Если это будет недостаточно быстро, вы можете разделить экран на более мелкие, например, растровые изображения 100x100 или 50x50, проверить, изменилась ли эта область, и если да, просто отправьте ее клиенту.

person Mateusz Krzaczek    schedule 12.02.2013

Вам необходимо оптимизировать свой протокол, вот несколько предложений:

  • разбивать входное изображение на сегменты, отправлять сегменты вместо полноэкранного
  • отправлять только сегмент, если он отличается от ранее отправленной версии
  • используйте тип связи HTTP-уведомление, при котором ваш зритель отправляет запрос, но получает ответ только в том случае, если сервер получил новые сегменты от ведущего, возможно, несколько сгруппированных вместе.
  • сжимать данные изображения, не передавать сырые
  • дать пользователям возможность выбрать уровень сжатия, чтобы ускорить процесс или получить лучшее изображение
  • Я сомневаюсь, что это будет в вашем бюджете, но вы также можете кодировать поток как потоковое видео
person Sten Petrov    schedule 12.02.2013

А как насчет использования существующей реализации? Или извлекать уроки из этого? http://cdot.senecac.on.ca/projects/vncsharp/

person delixfe    schedule 12.02.2013