.NET REMOTING 技朮(值得用這一 技朮)
发布时间:2020-12-17 02:45:51 所属栏目:安全 来源:网络整理
导读:一、Remoting简介 .NET?Remoting(下文简称Remoting)是一种可用于开发分布式应用程序的技术。其主要的结构,分为:远程对象、提供远程对象的远程服务器,以及可以访问何使用远程对象的客户端。这三个部分,可以分布于同一台计算机的同一个进程,或者是不同的
一、Remoting简介 .NET?Remoting(下文简称Remoting)是一种可用于开发分布式应用程序的技术。其主要的结构,分为:远程对象、提供远程对象的远程服务器,以及可以访问何使用远程对象的客户端。这三个部分,可以分布于同一台计算机的同一个进程,或者是不同的进程,也可以是处于网络上的不同的计算机。Remoting技术最大的特点,就是对远程通信的过程进行了抽象和封装,使开发人员不必去处理底层通信的细节,而可以把重点放在对业务逻辑的处理上。而且Remoting的通信协议也比较灵活,可以使用多个通信协议、不同的数据格式类型,以及不同类型的序列化机制。在某些情况下,Remoting还允许你使用自定义的数据格式。 二、.NET?Remoting与DCOM 说到这里,你也许会想到DCOM(分布式组件对象模型),在以前的分布式应用中,DCOM是一种比较高效的解决方案。和Remoting技术相比,DCOM在进行数据传输的时候,使用的是专有的二进制数据格式,而Remoting可以使用任意一种格式,包括二进制格式和XML格式,以及用户自定义的数据格式。DCOM的另外一个问题,就是在网络环境中,大部分的防火墙不允许DCOM穿过,解决的办法是重新配置防火墙。利用Remoting,可以轻松的穿过防火墙,一切可以顺利的进行?:)。因此,在实质上,可以认为Remoting是DCOM针对.NET的改进版本。 三、.NET?Remoting与Web?Service 运行于Internet的分布式应用程序,Web?Service是首选的解决方案,因为Web?Service能够穿透足够安全的防火墙,虽然Remoting技术也可以实现这样的功能,但是对于Internet解决方案,Web?Service仍是首选。和Web?Service相比,Web?Service需要Web服务器的支持,Remoting不需要Web服务器,它是使用自己的HTTP或者TCP服务器。在内部网络的解决方案中,Remoting拥有足够的优势,当采用TCP和二进制数据传输的时候,能有更高的效率。不过有一点值得注意:Web?Service可以跨平台运行,而Remoting只能运行在.NET?FrameWork的平台下。 四、简单的例子,开始我们的Remoting之旅 讲了这么多,都是理论的东西,相信大家已经跃跃欲试了。下面我们还是按照老规矩,用一个经典的Hello?World来开始我们的Remoting之旅吧!我们的例子,也是分三步开始: 建立远程对象;? 建立远程服务器;? 建立客户端程序,调用远程对象;? 准备好了吗?Let''s?go~! 首先,我们编写远程对象的类? namespace?RemoteObject { public?__gc?class?RemoteObjClass:public?MarshalByRefObject { public: String?*?DisplayMessage() { return?S"Hello?World!"; } }; }? 这是一个很简单的类,DisplayMessage成员函数,返回一串字符:Hello?World。在这里,我们要注意MarshalByRefObject,我们的类就是从它继承而来。在.NET中有应用程序域的概念,MarshalByRefObject类,能让对象跨应用域被访问。? 然后,我们来建立远程服务器,代码如下: using?namespace?System; using?namespace?System::Runtime::Remoting; using?namespace?System::Runtime::Remoting::Channels; using?namespace?System::Runtime::Remoting::Channels::Tcp; using?namespace?RemoteObject; int?_tmain() { //?TODO:?请用您自己的代码替换下面的示例代码。 TcpChannel?*Channel=new?TcpChannel(8888); ChannelServices::RegisterChannel(Channel); RemotingConfiguration::RegisterWellKnownServiceType( Type::GetType( "RemoteObject.RemoteObjClass,RemoteObject"),S"Test",WellKnownObjectMode::SingleCall); Console::WriteLine(S"Server?is?running..."); Console::ReadLine(); return?0; }? (注:服务端和客户端,由于用到Remoting相关的类,所以需要在工程中,添加对System.Runtime.Retmoting的引用) 服务器和客户端之间的通信,是借由通道来实现的。在我们的服务器的代码中,首先,就是建立一个端口好为8888的Tcp通道,数据使用二进制方式传输,这样,服务器端将在端口8888进行监听。然后ChannelServices::RegisterChannel注册Tcp通道和服务。RemotingConfiguration::RegisterWellKnownServiceType把需要被远程访问的对象注册为已知类型。第一个参数,为对象的类型,第二个参数,是一个字符串,它和远程客户端访问的时候,用的URI有关。举个例子,在我们的程序中,本机调试的情况下,客户端访问客户端的远程对象的时候URI的地址就为:?tcp://localhost:8888/Test?,localhost是指向本机的,如果在内部网络中,可以指定为服务器端的IP地址。?第三个参数,是调用的方式,在Remoting中,分为Singleton和SingleCall。二者的差别,我在以后的文章中会介绍。SingleCall,会在客户端每次访问的时候,创建一个实例,而Singleton只是创建一个实例,以后客户端的调用,都是共享这个实例。 实现远程客户端: #include?"stdafx.h" #using? using?namespace?System; using?namespace?System::Runtime::Remoting; using?namespace?System::Runtime::Remoting::Channels; using?namespace?System::Runtime::Remoting::Channels::Tcp; using?namespace?RemoteObject; int?_tmain() { TcpClientChannel?*Channel=new?TcpClientChannel(); ChannelServices::RegisterChannel(Channel); RemoteObjClass?*pObj=static_cast( Activator::GetObject( Type::GetType("RemoteObject.RemoteObjClass,S"tcp://localhost:8888/Test")); Console::WriteLine(S"Return?String?is:{0}",pObj->DisplayMessage()); Console::ReadLine(); return?0; }? 在我们建立了服务端和远程对象之后,客户端就比较简单了。主要就是创建一个TcpChannel对象,用于和服务器端通信,不同的地方,是我们不需要指定一个端口。因为在客户端可以使用任何一个随机的端口。Activator::GetObject用来获取对远程对象的引用。之后,我们就可以像调用本地对象一样,来调用远程对象的方法了。程序的运行结果如下图: 整个过程就是这样了。和DCOM相比较,我们会看到,Remoting比DCOM简化了很多。在以后的文章,我会详细介绍Remoting的其他功能和特性。?以上程序,需要.NET?Framework?1.1的支持。?? ?
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |