1、.NET Remoting概念

1、一种分布式处理方式。从字面意义上看出,他是基于.net平台的一种远程对象开发技术,该技术是将远程计算机中的数据视为分布式对象来进行开发。

2、一种网络通信技术。既然这种技术可以操作远程计算机的数据,他当然是网络通信技术。

2、.NET Remoting使用的技术

1、Xml

2、SOAP

SOAP=简单对象传输协议。

3、序列化

-二进制

-xml

3、.NET Remoting原理

通过通道(Channel)实现网络之间通信的。

1、首先通过Remoting访问通道以获得服务端访问对象

2、再通过代理解析为客户端对象

3、然后就可以在客户端去操作这个服务端对象了

客户端要获取服务器端对象,我们只需要知道通道的类型(TcpChannel和HttpChannel)和服务器端的端口号就可以了,无需知道数据包的格式。

要注意的是,客户端在获取服务端对象时,并不是获取服务端实际的对象,而是获取了他的引用,这既保证了客户端和服务器端的有关对象的松散耦合,同时也优化了通信的性能。

4、.NET Remoting中的主要元素

4.1 远程对象

远程对象是.net remoting的核心元素,他分为两种

1、操作远程对象

2、传递远程对象

操作远程对象,就是对象运行在远程,客户端通过引用来发送操作消息。这种远程对象必须是MarshlByRefObject这个类的派生类, 这样才能将他的对象引用传递到客户端。

传递远程对象是指将远程对象复制到本地,客户端对其操作,然后把操作后的副本发送回服务器端,此类的操作对象必须标记为[Serializable]

4.2 通道(Channels)

分为 TcpChannel 和HttpChannel。

TcpChannel使用二进制格式序列化消息对象,因此他具有更高的传输性能。

HttpChannel使用SOAP格式序列化消息对象,因此他具有更好的互操作性。

4.3 激活方式

什么是激活方式?我们在操作远程对象时需要考虑一个问题:远程对象何时创建,由谁来创建,这些都取决于激活方式。

激活方式分为两种:服务器激活和客户端激活。

主要是学习服务器激活方式。

Singleton

SingleCall

5、.NET Remoting的开发步骤

using System.Runtime.Remoting;

using System.Runtime.Remoting.Channels;

using System.Runtime.Remoting.Channels.Tcp;

using System.Runtime.Remoting.Channels.Http;

5.1 步骤1:创建远程对象类

远程对象类必须派生自System.MarshlByRefObject。

/*

     * 远程对象类必须派生自MarshalByRefObject

     */

    public class RemoteClass : MarshalByRefObject

    {

        int num = ;

        public RemoteClass()

        {

            Console.WriteLine("激活了RemoteClass远程对象");

        }

        public string Method(string name)

        {

            Console.WriteLine("第{0}次调用,参数为{1}", num++, name);

            return "hello " + name;

        }

    }

5.2 步骤2:创建服务端宿主程序,用于接收客户端请求

1、注册管道

2、注册服务器激活对象方式

/*

     *  需要引用System.Runtime.Remoting

     */

    class Program

    {

        static void Main(string[] args)

        {

            //1、注册管道

            TcpChannel tcpChannel = new TcpChannel();//端口指定

            HttpChannel httpChannel = new HttpChannel();

            ChannelServices.RegisterChannel(tcpChannel, true);

            ChannelServices.RegisterChannel(httpChannel, false);

            //2、注册服务器激活方式

            //WellKnownObjectMode.Singleton表示生成的实例是单例模式

            //WellKnownObjectMode.SingleCall表示每个传入消息是由新的对象实例

            RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteClass), "HelloTest", WellKnownObjectMode.SingleCall);

            Console.WriteLine("这里是服务器端宿主程序");

            Console.Read();

        }

    }

5.3 步骤3:创建客户端,调用远程对象

1、注册通道

2、根据URL获取对象代理

3、使用代理调用远程对象

 class Program

    {

        static void Main(string[] args)

        {

            #region TCP方式

            /*

            //1、注册通道

            TcpChannel tcpChannel = new TcpChannel();//客户端不需要指定端口号

            ChannelServices.RegisterChannel(tcpChannel, true);

            //2、创建代理

            RemoteClass rc = (RemoteClass)Activator.GetObject(typeof(RemoteClass), "tcp://localhost:10000/HelloTest");//1000端口号是服务器端指定的

            if (rc == null)

            {

                Console.WriteLine("Could not locate TCP Server");

            }

            Console.WriteLine("TCP方式{0}", rc.Method("张飞"));

            //*/

            #endregion

            #region Http方式

            HttpChannel httpChannel = new HttpChannel();

            ChannelServices.RegisterChannel(httpChannel, false);

            RemoteClass object2 = (RemoteClass)Activator.GetObject(typeof(RemoteClass), "http://localhost:10001/HelloTest");

            if (object2 == null)

            {

                Console.WriteLine("Could not locate HTTP Server");

            }

            Console.WriteLine("HTTP方式{0}", object2.Method("关羽"));

            #endregion

            Console.Read();

        }

}

5.4 调试

1、设置Server为启动项目

2、f5启动服务端

4、启动client

效果:

6、.NET Remoting的配置文件

不用代码注册,用配置文件

服务端:

RemotingConfiguration.Configure(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile, true);

客户端:

RemotingConfiguration.Configure(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile, true);

RemoteClass obj = new RemoteClass();

Console.WriteLine("HTTP方式{0}", obj.Method("祥子"));

最新文章

  1. Linux shell 通配符 / glob 模式
  2. IBatis.Net使用总结(二)-- IBatis返回DataTable/DataSet(网上例子的集合)
  3. BZOJ 1304: [CQOI2009]叶子的染色
  4. CMD命令之 :修改windows的CMD窗口输出编码格式为UTF-8
  5. MySQL笔记-最简单的方法来解决找不到mysqld.sock文件的问题
  6. vpn分类[转]
  7. bash脚本编程之一 变量、变量类型等
  8. MSSQL索引优化
  9. 1、WWDC2014 详解OSX/iOS8/Swift语言
  10. 【Andord真】SlideMenu+ViewPagerIndictor双滑动边栏+滑动导航条
  11. Chromium Graphics: GPUclient的原理和实现分析之间的同步机制-Part II
  12. 使用方便 正则表达式grep,sed,awk(一)
  13. 破译情报-NOIP2016提高组复赛模拟试题
  14. webservice Dome--一个webservice的简单小实例
  15. Html5如何自学 只需这几步
  16. JS运行机制之 Event Loop 的思考
  17. Laravel分页带参数的实现方法
  18. 设计模式C++实现——装饰者模式
  19. android studio 编译sdk版降低报错解决方法
  20. (完整)爬取数据存储之TXT、JSON、CSV存储

热门文章

  1. .NET项目发布到本地IIS完整流程(VS2015)
  2. UDF——已知入口压力和流量计算压降
  3. Navicat 12.x for MySQL最新版安装破解教程(附安装包和注册机,全网独家可用
  4. 使用 Microsoft.Web.Administration 管理iis
  5. Ubuntu 安装最新版 (1.12) Golang 并使用 go mod
  6. android --------System.err: java.net.UnknownServiceException: CLEARTEXT .....
  7. ASP.NET Core中的Startup
  8. shebang是啥
  9. Mysql创建数据库以及用户分配权限
  10. Python之多态案例