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("祥子"));

NETRemoting学习笔记的更多相关文章

  1. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  2. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  3. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  4. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  5. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  6. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  7. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

  8. HTML学习笔记

    HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...

  9. DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记

    今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...

随机推荐

  1. python 判断元素是否在一个列表中

    import random val= data=[,,,,] : find=False val=int(input('请输入查找键值(1-9),输入-1离开:')) for i in data: if ...

  2. win10中通过Anaconda安装tensorflow时报错Traceback (most recent call last): File “E:\Anaconda3\lib\site-packages\pip_vendor\urllib3\response.py”, line 360, in _error_catcher yield

    问题:通过默认镜像安装,下载过程中可能会报错,下载安装失败 Traceback (most recent call last): File “E:\Anaconda3\lib\site-package ...

  3. WPF——OXY绘图_old

    plotModel = new PlotModel() { Title = "数据统计", LegendTitle = "Max:红色,Min:黄色", Leg ...

  4. JavaScript初探系列(九)——BOM

    一.什么是BOM? BOM:Browser Object Model 是浏览器对象模型,浏览器对象模型提供了独立与内容的.可以与浏览器窗口进行互动的对象结构,BOM由多个对象构成,其中代表浏览器窗口的 ...

  5. 剑指offer:序列化二叉树

    题目描述: 请实现两个函数,分别用来序列化和反序列化二叉树 思路分析: 这里一开始有点不明白题目的意思.实际上序列化应该指把二叉树用某种编码方式表示,这里一般是字符串的形式.而反序列就是将之前生成的序 ...

  6. /etc/resolv.conf options rotate

    timeout:n sets  the  amount  of time the resolver will wait for a response from a remote name server ...

  7. mysql 后台运行命令

    nohup mysql -u sa -pabcd1234 -e 'source /db.sql' &

  8. Spark2.x(六十二):(Spark2.4)共享变量 - Broadcast原理分析

    之前对Broadcast有分析,但是不够深入<Spark2.3(四十三):Spark Broadcast总结>,本章对其实现过程以及原理进行分析. 带着以下几个问题去写本篇文章: 1)dr ...

  9. 一句命令激活windows/office (https://03k.org/kms.html)

    https://03k.org/kms.html 本站上线KMS服务~一句命令激活windows/office kissshot2015年11月1日 装机必备, 软件下载 240 条评论 服务器地址: ...

  10. An overview of time series forecasting models

    An overview of time series forecasting models 2019-10-04 09:47:05 This blog is from: https://towards ...