2013-02-12 1 views
1

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

Что я в основном делаю, так это то, что клиент делает запрос на сервер, запрашивая изображение на экране каждые 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 FPS (обновлять каждые 5 секунд). Обобщение: я использую Windows Forms, и это делается через сокеты.

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

+0

Вы хотите воссоздать, что уже делают RDP, VNC, Citrix? – PinnyM

+0

@PinnyM Да, но он хочет сделать это очень медленно. Предположительно, он только делится презентациями PowerPoint;) –

+0

Это выглядит интересно, из Vista есть API: http://www.teknoportal.gen.tr/english/technology_news.asp?haber=385 –

ответ

1

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

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

2

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

  • перерыв входного изображения в сегментах, отправь сегменты вместо полного экрана
  • только послать сегмент, если он отличается от ранее отправленного версии
  • http notification тип связи, когда ваш зритель отправляет запрос, но получает ответ только в том случае, если сервер получил новые сегменты от ведущего, возможно, несколько сгруппированных вместе.
  • сжимать данные изображения, не передает сырыми
  • дать пользователям возможность выбрать уровень сжатия, чтобы ускорить или получить лучшее изображение
  • я сомневаюсь, что это будет в вашем бюджете, но вы можете также кодируют поток как потоковое видео