【转载】.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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Golang中Int32转换为int16丢失精度的具体过程

    Golang中Int32转换为int16丢失精度的具体过程为什么80%的码农都做不了架构师?>>>…

    2022年8月15日
    3
  • scrapy爬虫部署服务器「建议收藏」

    scrapy爬虫部署服务器「建议收藏」scrapy爬虫部部署服务器时间:2020年5月27日18:28:30作者:钟健记录:scrapy爬虫关键字:scrapyscrapydscrapydweb一、scrapy爬虫部署服务器scrapy通过命令行运行一般只用于测试环境,而用于运用在生产环境则一般都部署在服务器中进行远程操作。scrapy部署服务器有一套完整的开源项目:scrapy+scrapyd(服务端)+scrapy-client(客户端)+scrapydweb1、scrapyd1.介绍Scrapyd是用于部署和运

    2022年6月18日
    29
  • linux访问samba共享_centos7共享文件夹设置

    linux访问samba共享_centos7共享文件夹设置LinuxSamba共享配置教程一、samba介绍linux与windows共享文件一般的方法就是设置共享文件夹和搭建samba服务器。samba服务器作可以windows和linux交互的媒介,可以让windows用户轻松地在电脑上使用图形界面访问linux文件系统,并可以设置写入权限,实用性极佳。二、samba安装首先需要安装samba程序,部分Ubuntu镜像已经自带;执行如下命令即可sudoapt-getinstallsambasudoapt-getins

    2022年9月24日
    3
  • Faster-rcnn详解「建议收藏」

    Faster-rcnn详解「建议收藏」论文题目:FasterR-CNN:TowardsReal-TimeObjectDetectionwithRegionProposalNetworks论文链接:论文链接论文代码:Matlab版本点击此处,Python版本点击此处作为一个目标检测领域的baseline算法,Faster-rcnn值得你去仔细理解里面的细节,如果你能深入的了解这些,我相信你会受益匪浅。…

    2022年10月4日
    5
  • symbian软件下载_手机系统更新软件

    symbian软件下载_手机系统更新软件编辑器加载中…常见软件类型  .sis和.sisx  分别的是第一、二版和第三版、第五版标准的SymbianOS操作系统唯一的可执行安装的安装文件,直接传入手机安装即可。  .app  一般来说*.app文件是某个软件的激活成功教程补丁文件,就是可以将未注册的软件变成已注册软件的文件。一般使用app激活成功教程的方法:利用文件管理程序(如文件动力)将某个软件一同带的*.app文件通过…

    2022年9月24日
    3
  • servlet到底是什么?[通俗易懂]

    servlet到底是什么?[通俗易懂]servlet到底是什么?对于这个问题一直云里雾里的,今天打算刨根问底。一、Servlet简介  Servlet是sun公司提供的一门用于开发动态web资源的技术。  Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:  1、编写一个Java类,实现servlet接口。

    2022年6月25日
    27

发表回复

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

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