我正在通过从头开始编写 VNC 等自定义远程控制应用程序来学习 WCF、LINQ 和其他一些技术。我创建它时考虑了三个主要目标:
- 服务器将在应用程序级别(即无缝窗口)提供“远程控制”,而不是完整的桌面访问。
- 客户端可以选择服务器上运行的任意数量的应用程序并接收每个应用程序的图像流。
- 一个客户端可以同时连接到多个服务器。
现在我正在使用 WCF 发送代表正在发送的窗口的字节数组:
using (var ms = new MemoryStream()) {
window.GetBitmap().Save(ms, ImageFormat.Jpeg);
frame.Snapshot = ms.ToArray();
}
获取位图实现:
var wRectangle = GetRectangle();
var image = new Bitmap(wRectangle.Width, wRectangle.Height);
var gfx = Graphics.FromImage(image);
gfx.CopyFromScreen(wRectangle.Left, wRectangle.Top, 0, 0, wRectangle.Size, CopyPixelOperation.SourceCopy);
return image;
然后它通过 WCF(TCPBinding,并且始终通过 LAN)发送到客户端,并以没有边框的空白窗口形式重建,如下所示:
using (var ms = new MemoryStream(_currentFrame.Snapshot))
{
BackgroundImage = Image.FromStream(ms);
}
我希望使这个过程在 CPU 和内存使用方面尽可能高效,而带宽则排在第三位。我的目标是让客户端连接到 5 个以上的服务器,每个服务器有 10 个以上的应用程序。
我现有的方法是最好的方法(同时继续使用这些技术)吗?我可以做些什么来改进它?
我正在研究的想法(但我没有经验):
- 使用开源图形库来捕获和保存图像而不是.Net 解决方案。
- 保存为 PNG 或其他图像类型而不是 JPG。
- 每次发送图像增量而不是完整图像。
- 尝试“记录”窗口并创建压缩视频流而不是图片快照(mpeg?)。