【转载】.NET Remoting学习笔记(一)概念

【转载】.NET Remoting学习笔记(一)概念

目录
  • .NET Remoting学习笔记(一)概念
  • .NET Remoting学习笔记(二)激活方式
  • .NET Remoting学习笔记(三)信道
背景

自接触编程以来,一直听过这个名词Remoting,但是对他了解少之又少,近日有点时间,参考研究研究。

其相关概念本章不做详解,具体大家可以看下  http://baike.baidu.com/view/742675.htm?fr=aladdin  ,写的很详细。

.Net Remoting概念

概念:一种分布式处理方式。从微软的产品角度来看,可以说Remoting就是DCOM (分布式组件对象模式)的一种升级,它改善了很多功能,并极好的融合到.Net平台下。

好处:

1.提供了一种允许对象通过应用程序域与另一对象进行交互的框架。

在Windows操作系统中,是将应用程序分离为单独的进程。这个进程形成了应用程序代码和数据周围的一道边界。如果不采用进程间通信(RPC)机制,则在一个进程中执行的代码就不能访问另一进程。这是一种操作系统对应用程序的保护机制。然而在某些情况下,我们需要跨过应用程序域,与另外的应用程序域进行通信,即穿越边界。

2.可以服务的方式来发布服务器对象:

代码可以运行在服务器上(如服务器激活的对象和客户端激活的对象),然后客户端再通过Remoting连接服务器,获得该服务对象并通过序列化在客户端运行。

3.客户端和服务器端有关对象的松散耦合

在Remoting中,对于要传递的对象,设计者除了需要了解通道的类型和端口号之外,无需再了解数据包的格式。这既保证了客户端和服务器端有关对象的松散耦合,同时也优化了通信的性能。

.NET Remoting支持通道与协议

Remoting的通道主要有两种:Tcp和Http,IChannel 包含TcpChannel,HttpChannel

TcpChannel:Tcp通道提供了基于Socket 的传输工具,使用Tcp协议来跨越Remoting边界传输序列化的消息流。默认使用二进制格式序列化消息对象,具有更高的传输性能。适用局域网。

HttpChannel:它提供了一种使用 Http协议,使其能在Internet上穿越防火墙传输序列化消息流。HttpChannel类型使用Soap格式序列化消息对象,因此它具有更好的互操作性。适用万维网。

与WCF、WebService 区别

这里写的比较好:http://kb.cnblogs.com/page/50681/

  • Remoting可以灵活的定义其所基于的协议,比如http,tcp等,如果定义为HTTP,则与Web Service相同,但是webservice是无状态的,使用remoting一般都喜欢定义为TCP,这样比Web Service稍为高效一些,而且是有状态的。 
  • Remoting不是标准,而Web Service是标准。 
  • Remoting一般需要通过一个WinForm或是Windows服务进行启动,也可以使用iis部署,而Web Service则必须在IIS进行启动。 
  • 在VS.net开发环境中,专门对Web Service的调用进行了封装,用起来比Remoting方便。 
  • net remoting只能应用于MS 的.net framework之下,需要客户端必须安装framework,但是WebService是平台独立的,跨语言(只要能支持XML的语言都可以) 以及穿透企业防火墙。
.NET Remoting激活方式

简单的理解:我们知道,在我们的Remoting应用需要远程处理对象,那么这些对象是怎么创建的?又是由谁去创建的呢?… 而激活方式则正是要说明这些疑问。

远程对象的激活分为两大类:服务器端激活(WellKnow)和客户端激活。

服务器端激活有两种模式:SingleTon模式和SingleCall。

实现Remoting步骤

1.创建远程处理的类型(由于Remoting传递的对象是以引用的方式,因此所传递的远程对象类必须继承MarshalByRefObject。)

2.创建服务端

3.创建客户端

MarshalByRefObject

MarshalByRefObject 是那些通过使用代理交换消息来跨越应用程序域边界进行通信的对象的基类。

不是从 MarshalByRefObject 继承的对象会以隐式方式按值封送。

当远程应用程序引用一个按值封送的对象时,将跨越远程处理边界传递该对象的副本。

因为您希望使用代理方法而不是副本方法进行通信,因此需要继承MarshallByRefObject。
在Remoting中能够传递的远程对象可以是各种类型,包括复杂的DataSet对象,只要它能够被序列化。远程对象也可以包含事件,但服务器端对于事件的处理比较特殊。

一个简单的案列

1.编写远程处理类

using System;
using System.Runtime.Remoting.Metadata;

namespace MessageMarshal
{
    /*创建发送消息委托*/
    public delegate void SendMessageHandler(string messge);

    [Serializable]
    public class TestMessageMarshal : MarshalByRefObject
    {
        /*创建发送消息事件*/
        public static event SendMessageHandler SendMessageEvent;

        /*发送消息*/
        [SoapMethod(XmlNamespace = "MessageMarshal", SoapAction = "MessageMarshal#SendMessage")]
        public void SendMessage(string messge)
        {
            if (SendMessageEvent != null)
                SendMessageEvent(messge);
        }
    }
}

2.创建服务端

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;

namespace TestRemotingServer
{
    public class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("创建HTTP通道");

            /*创建HTTP通道*/
            HttpChannel channel = new HttpChannel(816);

            /*注册通道服务端*/
            ChannelServices.RegisterChannel(channel, false);

            /*服务端注册,使用Singletong激活*/
            RemotingConfiguration.RegisterWellKnownServiceType(typeof(MessageMarshal.TestMessageMarshal), "TestMessageMarshal", WellKnownObjectMode.Singleton);

            /*接收客户端事件*/
            MessageMarshal.TestMessageMarshal.SendMessageEvent += new MessageMarshal.SendMessageHandler(TestMessageMarshal_SendMessageEvent);

            Console.Read();
        }

        static void TestMessageMarshal_SendMessageEvent(string messge)
        {
            Console.WriteLine(messge);
        }
    }
}

3.创建客户端

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using System.Threading;

namespace TestRemotingClient
{
    class Program
    {
        static void Main(string[] args)
        {
            /*创建通道*/
            HttpChannel channel = new HttpChannel();

            /*注册通道*/
            ChannelServices.RegisterChannel(channel, false);

            /*注册通道 的 远程处理类型*/
            RemotingConfiguration.RegisterWellKnownClientType(typeof(MessageMarshal.TestMessageMarshal), "http://localhost:816/TestMessageMarshal");

            /*创建消息实体*/
            MessageMarshal.TestMessageMarshal TestMessage = new MessageMarshal.TestMessageMarshal();

            while (true)
            {
                TestMessage.SendMessage("DateTime.Now:" + System.DateTime.Now.ToString());
                Console.WriteLine("send message...");
                Thread.Sleep(2000);
            }
        }
    }
}

4.测试
<span>【转载】.NET Remoting学习笔记(一)概念</span>

暂时写到这,如有问题欢迎指正!后续继续更新

 

作者:释迦苦僧 出处:http://www.cnblogs.com/woxpp/p/3992771.html 

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119396.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Centos7监控服务异常发送邮件通知

    Centos7监控服务异常发送邮件通知

    2022年2月19日
    87
  • latex中希腊字母怎么输入_在电脑上怎么打希腊字母

    latex中希腊字母怎么输入_在电脑上怎么打希腊字母$$\alpha\quad\beta$$%\quad空格的意思$$\gamma\quad\Gamma$$$$\delta\quad\Delta$$$$\theta\quad\Theta$$$$\epsilon\quad\pi$$$$\Pi\quad\omega$$$$\Omega$$

    2022年10月13日
    2
  • maven配置多仓库镜像「建议收藏」

    maven配置多仓库镜像「建议收藏」问题场景:1、国内访问maven默认远程中央镜像特别慢2、用阿里的镜像替代远程中央镜像3、大部分jar包都可以在阿里镜像中找到,部分jar包在阿里镜像中没有,需要单独配置镜像我想达到的目标:在maven中配置一主一副两个镜像,大部分jar直接通过主镜像可以找到,部分特殊jar在主镜像中找不到时,自动去副镜像中寻找。我所处的阶段:修改了maven的全局配置文件settin…

    2022年5月28日
    147
  • Anchorpoint_insert_tid_for_question_process

    Anchorpoint_insert_tid_for_question_process引言相信初接触到CALayer的人都会遇到以下几个问题: 为什么修改anchorPoint会移动layer的位置?CALayer的position点是哪一点呢?anchorPoint与position有什么关系?我也迷惑过,找过网上的教程,大部分都是复制粘贴的,有些是翻译的文章但很有问题,看得似懂非懂,还是自己写代码彻底弄懂了,做点笔记吧。每一个UIView内部都默认关联着一个CALa…

    2022年10月8日
    3
  • iphone相册打开是横屏_苹果手机相册变成横屏怎么办

    iphone相册打开是横屏_苹果手机相册变成横屏怎么办1.在以往开发中,app调用相册一直没问题。最近开发ipad的时候,项目必须横屏,这时候调用相册的时候app就奔溃了问题所在:系统的相册只支持竖屏打开,如果你的app设置了只能横屏,就会冲突,打不开相册,程序会崩溃。解决方法:在网上找了很久,很多说在打开相册的时候强制竖屏,或者重写一个类,继承UIImagePickerController,重写他的 –

    2022年9月22日
    2
  • 基于51单片机控制步进电机正反转「建议收藏」

    基于51单片机控制步进电机正反转「建议收藏」基于51单片机控制步进电机正反转此次采用uln2003模块来链接步进电机;##步进电机工作原理步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机。每输入一个脉冲信号,转子就转动一个角度或前进一步,其输出的角位移或线位移与输入的脉冲数成正比,转速与脉冲频率成正比。步进电动机的结构形式和分类方法较多,一般按励磁方式分为磁阻式、永磁式和混磁式三种;按相数可分为单相、两相、三相和多相等形式。因此我们可以控制单片机I/O口的电平来控制步进电机,此次设计中采用四相单拍工作方式,在这种工作方式下,A、

    2022年5月31日
    29

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号