.NET Remoting学习笔记(一)概念

目录

背景

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

其相关概念本章不作详解,具体你们能够看下  http://baike.baidu.com/view/742675.htm?fr=aladdin  ,写的很详细。web

 

.Net Remoting概念

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

好处:服务器

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

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

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;

/*code 释迦苦僧*/
namespace MessageMarshal
{
    /*建立发送消息委托*/
    public delegate void SendMessageHandler(string messge);
    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
{
    /*code:释迦苦僧*/
    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;

/*code 释迦苦僧*/
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/test");  
            /*建立消息实体*/
            MessageMarshal.TestMessageMarshal TestMessage = new MessageMarshal.TestMessageMarshal();

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

4.测试

 

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

 

做者:释迦苦僧 出处:http://www.cnblogs.com/woxpp/p/3992771.html 本文版权归做者和博客园共有,欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文链接。

相关文章
相关标签/搜索