remoting

一种分布式处理方式,可以说是DCOM的一种升级跨过应用程序域,与另外的应用程序域进行通信,即穿越边界

在remoting中是通过通道(channel)来实现两个应用程序域之间对象的通信的

优点: 

      1、能让我们进行分布式开发 

      2、Tcp通道的Remoting速度非常快 

      3、虽然是远程的,但是非常接近于本地调用对象 

      4、可以做到保持对象的状态 

      5、没有应用程序限制,可以是控制台,winform,iis,windows服务承载远程对象 

缺点: 
      1、非标准的应用,因此有平台限制 
      2、脱离iis的话需要有自己的安全机制

Remoting更多参考: 细细品味C#——.Net Remoting专题(文章下载)

Microsoft .Net Remoting系列专题之一:.Net Remoting基础篇

初探remoting双向通信(一)

socket VS remoting

网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。

使用socket无疑是效率最高的。但是,在复杂的接口环境下,socket的开发效率也是最低的。故在兼顾开发效率的情况下,可以使用remoting来代替socket开发。并且:
    1、Tcp通道的Remoting速度非常快。
    你可以通过端口查看工具,发现remoting比直接socket传输的内容,应该是属于同一个数量级的。
    2、虽然是远程的,但是非常接近于本地调用对象。
    也就是完全符合面向对象思想。
    3、可以做到保持对象的状态
    直接使用socket传输机制,我们必须花大量的精力来处理异常、断网、死机等现象,使用remoting,这些工作会大大简化。Socket是用于通讯、传输数据的,Remoting主要是远程调用对象的。 .NET Remoting不过是建立在Socket上的高级应   。。如果你是主要进行数据库操作,remoting适合你,而且控制起来比socket容易

remoting vs webservice 

   1、remoting可寄宿在你自己的代码中,也可寄宿在windows服务及IIS中。最大程度的提供了开发和部署的灵活性。
   2、remoting在使用http通道的时候,也如web service一样支持穿透路由。但WebService是跨平台的,Java和.Net可以互相提供和引用对方的Web Service,.net remoting就限制于.net平台使用
   3、remoting与web sercie相比,提供双向通信。哪怕是将remoting寄宿在IIS中,也支持。
   4、当然,web service最主要优势是,它是一个行业标准,而remoting只是微软自己内部的标准,如果你的应用要脱离微软的平台,就只能使用web service了。

  5、.net remoting是有状态的,是紧密耦合;web service是无状态的(因为http是无状态的),是松散耦合;总的来说remoting适合局域网内,对性能和响应效率要求较高的场合;而web service适合跨网络,跨系统,对移植性和通用性要求较高的场合。.net remoting在局域网上的表现绝对是大大强于web services,使用tcp管道不失真的传输数据,从而减轻了序列化和反序列化的工作,当然使用WEB服务的时候,一台计算机存储32位整数的方式与另一台计算机的存储方式是不同的,因此需要像XML这样易于理解的格式。web services 是IIS执行的,而.NET Remoting的扩展性强,使用HTTP信道和XML可以达到web services的技术的一部分,个人觉得可以把web service看成是.NET Remoting的一个特例。

总结

从性能上讲:Socket>Remoting(TCP通道)>WebService。
如果你是Windows进程间通讯的话,WebService可以不用考虑。
如果两个进程 在不同机器的话,可以看情况使用Socket或Remoting
如果是本机进程间通讯的话,那就用Remoting(IPC通道)
不过Remoting也要序列化和反序列化,所以在数据生成方面Remoting并没有优势。

使用socket效率比较高,但是最大的问题是需要硬编码,传过去的数据包需要按位解析
使用Remoting比较好,传递的是类对象,不需要双方的协议了,而且基于TCP的Remoting效率也是很高的,.Net Framework帮你完成了序列化和反序列化。从程序可读和可维护性说,还是Remoting吧,但是个人感觉Remoting的事件不是很好用。

实例

参考《C#高级编程 第7版 第54章》

remoting与socket、web service的比较及实例

上图显示了客户端和服务器应用程序中的主要.NET Remoting 类。实现的远程对象是 HelloHelloServer是服务器上应用程序的主类, HelloClient 是客户端上应用程序的主类。

远程对象

分布式计算需要远程对象。从不同系统中远程调用的对象必须派生自 System.MarshalByRefObject对象。为了查看起作用的.NET Remoting,下面给远程对象创建一个简单的类库(不能独立运行,因此无main()函数)Hello 类派生自System.MarshalByRefObject。在构造函数中,把消息写入控制台中,提供对象的生命周期信息。此外,添加一个从客户端调用的 Greeting()方法。

程序集的名称是 RemoteHello,类的名称是 Hello
remoting与socket、web service的比较及实例
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RemoteHello
{
    public class Hello:System.MarshalByRefObject 
    {
        public Hello ()
        {
            Console.WriteLine("Constructor called");
        }
        public string Greeting(string name)
        {
            Console.WriteLine("Greeting called");
            return "Hello," + name;
        }
    }
}
View Code

简单的服务器应用程序

对于服务器,创建一个新的 C#控制台应用程序 HelloServer。为了使用 TcpServerChannel 类,必须引用 System.Runtime.Remoting 程序集。此外,还需要引用上一节创建的 RemoteHello 程序集。
Main()方法中,用端口号 8086 创建一个 System.Runtime.Remoting.Channels.Tcp.TcpServerChannel类型的对象。该信道使用 System.Runtime.Remoting.Channels.ChannelServices 类注册,使之可用于远程对象。远程对象类型通过调用 RemotingConfiguration. RegisterWellKnownServiceType()方法注册。

相关文章: