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



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

我基本上要做的是,客户端每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窗体,它是通过套接字完成的。

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

您只能发送当前图像和最后一张图像之间的差异。看这里:计算C#中的图像差异

如果速度不够快,您可以将屏幕划分为更小的部分,如100x100或50x50位图,检查该区域是否已更改,如果已更改,则将其发送给客户端。

您需要优化您的协议,这里有一些建议:

  • 将输入图像分段,发送分段而不是全屏
  • 仅当分段与以前发送的版本不同时才发送分段
  • 使用http通知类型的通信,在这种通信中,查看器发送请求,但只有在服务器接收到来自演示者的新片段(可能是几个片段组合在一起)时才会得到响应
  • 压缩图像数据,不传输原始数据
  • 让用户可以选择压缩级别以加快速度或获得更好的图像
  • 我怀疑这是否在你的预算内,但你也可以将流编码为流媒体视频

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

相关内容

  • 没有找到相关文章

最新更新