c# - 通过 WCF 发送图像的有效方法?

标签 c# wcf

我正在通过从头编写自定义远程控制应用程序(如 VNC)来学习 WCF、LINQ 和其他一些技术。我在创建它时考虑了三个主要目标:

  1. 服务器将在应用程序级别(即无缝窗口)而不是完整的桌面访问提供“远程控制”。
  2. 客户端可以选择服务器上运行的任意数量的应用程序,并接收每个应用程序的图像流。
  3. 一个客户端可以同时连接到多个服务器。

现在我正在使用 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?)。

最佳答案

您应该注意以下几点:

完成所有这些步骤并对您的最终代码感到满意后,您可以下载 VncSharp source code .它实现了 the RFB Protocol (Wikipedia entry) , "一种用于远程访问图形用户界面的简单协议(protocol)。因为它在帧缓冲区级别工作,所以它适用于所有窗口系统和应用程序,包括 X11、Windows 和 Macintosh。RFB 是 VNC(虚拟网络)中使用的协议(protocol)计算)。”

关于c# - 通过 WCF 发送图像的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1829269/

相关文章:

c# - 如何使用 MVVM 模式绑定(bind) Datagrid?

C# PCSC-sharp 发送/接收带有数据的自定义命令

c# - 在post请求中发送文件+参数

iphone - 将对象作为参数传递给 iOS 上 Objective C 中的 wcf 服务

wcf - 在 Web 服务应用程序中使用 lucene.net 的指南?

.net - 错误 400(错误请求): maxReceivedMessageSize not taken into account for my WCF service

c# - 如何确定字符串开头是两个还是一个数字?

c# - 如何在c#中调用delphi dll的事件?

java - 使用 Json 在 Android 客户端和 WCF 服务之间传递 DateTime 作为参数

wcf - 何时使用 WCF ChannelFactory 而不是服务引用