【发布时间】:2009-12-01 22:05:36
【问题描述】:
我正在通过从头开始编写自定义远程控制应用程序(如 VNC)来学习 WCF、LINQ 和其他一些技术。我在创建它时考虑了三个主要目标:
- 服务器将在应用程序级别(即无缝窗口)提供“远程控制”,而不是完整的桌面访问。
- 客户端可以选择服务器上运行的任意数量的应用程序并接收每个应用程序的图像流。
- 一个客户端可以同时连接到多个服务器。
现在我正在使用 WCF 发送代表正在发送的窗口的字节数组:
using (var ms = new MemoryStream()) {
window.GetBitmap().Save(ms, ImageFormat.Jpeg);
frame.Snapshot = ms.ToArray();
}
GetBitmap 实现:
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?)。
【问题讨论】: