编写自己的屏幕共享服务器和协议

时间:2013-02-12 15:27:07

标签: c# rdp screensharing

我正在构建一个需要具有屏幕共享功能的客户端/服务器解决方案。我有一些已经“正常工作”但问题是它只适用于内部网络,因为我的方法不够快。

我基本上做的是客户端请求服务器每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秒刷新一次)Obs。:我正在使用Windows Forms,它是通过套接字完成的。

  2. TeamViwer和.rdp文件如何工作?

3 个答案:

答案 0 :(得分:2)

您需要优化您的协议,以下是一些建议:

  • 分段输入图片,发送段而不是全屏
  • 仅发送与先前发送的版本
  • 不同的细分
  • 在您的查看者发送请求的情况下使用http notification类型的通信,但只有在服务器收到来自演示者的新片段时才会收到响应,可能是几个组合在一起。
  • 压缩图像数据,不要传输原始
  • 为用户提供选择压缩级别以加快速度或获得更好图像的选项
  • 我怀疑这会在您的预算中,但您也可以将流编码为流式视频

答案 1 :(得分:2)

使用现有实施怎么样?或者从中学习? http://cdot.senecac.on.ca/projects/vncsharp/

答案 2 :(得分:1)

您只能发送当前和最后一张图像之间的差异。看这里:Calculate image differences in C#

如果它不够快,你可以将你的屏幕划分为较小的,如100x100或50x50位图,检查这个区域是否已经改变,如果是,只需将其发送给客户。