热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

NETRemoting学习笔记

 

      NETRemoting学习笔记

 

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

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

2、.NET Remoting使用的技术

1、Xml

2、SOAP

SOAP=简单对象传输协议。

3、序列化

-二进制

-xml

 

3、.NET Remoting原理

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

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

 NETRemoting学习笔记

 

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

 NETRemoting学习笔记

 

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

 NETRemoting学习笔记

 

 

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

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

 

 

4、.NET Remoting中的主要元素

 NETRemoting学习笔记

 

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

             NETRemoting学习笔记

 

/*

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

     */

    public class RemoteClass : MarshalByRefObject

    {

        int num = 0;

        public RemoteClass()

        {

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

        }

        public string Method(string name)

        {

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

            return "hello " + name;

        }

    }

 

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

           1、注册管道

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

 NETRemoting学习笔记

 

 

/*

     *  需要引用System.Runtime.Remoting

     */

    class Program

    {

        static void Main(string[] args)

        {

            //1、注册管道

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

            HttpChannel httpChannel = new HttpChannel(10001);

 

            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、使用代理调用远程对象

 NETRemoting学习笔记

 

 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为启动项目

 NETRemoting学习笔记

 

2f5启动服务端

  NETRemoting学习笔记

 

 

4、启动client

 NETRemoting学习笔记

 

 

效果:

 

 NETRemoting学习笔记

 

NETRemoting学习笔记

 

 

 

 

6、.NET Remoting的配置文件

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

服务端:

 NETRemoting学习笔记

 

 

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

 

客户端:

 NETRemoting学习笔记

 

 

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

            RemoteClass obj = new RemoteClass();

 

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


推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • php缓存ri,浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
    thinkPHP的F方法只能用于缓存简单数据类型,不支持有效期和缓存对象。S()缓存方法支持有效期,又称动态缓存方法。本文是小编日常整理有关thinkp ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • Tomcat安装与配置教程及常见问题解决方法
    本文介绍了Tomcat的安装与配置教程,包括jdk版本的选择、域名解析、war文件的部署和访问、常见问题的解决方法等。其中涉及到的问题包括403问题、数据库连接问题、1130错误、2003错误、Java Runtime版本不兼容问题以及502错误等。最后还提到了项目的前后端连接代码的配置。通过本文的指导,读者可以顺利完成Tomcat的安装与配置,并解决常见的问题。 ... [详细]
  • 在开发中,有时候一个业务上要求的原子操作不仅仅包括数据库,还可能涉及外部接口或者消息队列。此时,传统的数据库事务无法满足需求。本文介绍了Java中如何利用java.lang.Runtime.addShutdownHook方法来保证业务线程的完整性。通过添加钩子,在程序退出时触发钩子,可以执行一些操作,如循环检查某个线程的状态,直到业务线程正常退出,再结束钩子程序。例子程序展示了如何利用钩子来保证业务线程的完整性。 ... [详细]
author-avatar
平凡兔兔2006
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有