RegisterActivatedServiceType RegisterActivatedClientType 客户端激活

RegisterActivatedServiceType

RegisterActivatedClientType

客户端激活

https://www.cnblogs.com/woxpp/p/3995366.html

与WellKnown模式不同, Remoting在激活每个对象实例的时候,会给每个客户端激活的类型指派一个URI。客户端激活模式一旦获得客户端的请求,将为每一个客户端都建立一个实例引用。SingleCall模式和客户端激活模式是有区别的:首先,对象实例创建的时间不一样。客户端激活方式是客户一旦发出调用的请求,就实例化;而SingleCall则是要等到调用对象方法时再创建。其次,SingleCall模式激活的对象是无状态的,对象生命期的管理是由GC管理的,而客户端激活的对象则有状态,其生命周期可自定义。其三,两种激活模式在服务器端和客户端实现的方法不一样。尤其是在客户端,SingleCall模式是由 GetObject()来激活,它调用对象默认的构造函数。而客户端激活模式,则通过CreateInstance()来激活,它可以传递参数,所以可以调用自定义的构造函数来创建实例。

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

/*code 释迦苦僧*/
namespace MessageMarshal
{
    /*创建发送消息委托*/
    public delegate void SendMessageHandler(string messge);
    [Serializable]
    public class TestMessageMarshal : MarshalByRefObject
    { 
        private Guid ID { get; set; }
        /*新建对象实例时重新创建标识编号*/
        public TestMessageMarshal()
        {
            ID = Guid.NewGuid();
        }

        /*创建发送消息事件*/
        public static event SendMessageHandler SendMessageEvent;

        /*发送消息*/
        [SoapMethod(XmlNamespace = "MessageMarshal", SoapAction = "MessageMarshal#SendMessage")]
        public void SendMessage(string messge)
        {
            if (SendMessageEvent != null)
                SendMessageEvent(ID.ToString() + "\t" + messge);
        }
    }
}
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using System.Runtime.Remoting.Channels.Tcp;
using MessageMarshal;
/*
客户端激活
与WellKnown模式不同, Remoting在激活每个对象实例的时候,
会给每个客户端激活的类型指派一个URI。客户端激活模式一旦获得客户端的请求,
将为每一个客户端都建立一个实例引用。

SingleCall模式和客户端激活模式是有区别的:
首先,对象实例创建的时间不一样。
客户端激活方式是客户一旦发出调用的请求,就实例化;
而SingleCall则是要等到调用对象方法时再创建。

其次,SingleCall模式激活的对象是无状态的,对象生命期的管理是由GC管理的,
而客户端激活的对象则有状态,其生命周期可自定义。

其三,两种激活模式在服务器端和客户端实现的方法不一样。
尤其是在客户端,SingleCall模式是由 GetObject()来激活,
它调用对象默认的构造函数。
而客户端激活模式,则通过CreateInstance()来激活,
它可以传递参数,所以可以调用自定义的构造函数来创建实例。

1.修改服务端代码
*/
namespace TestRemotingServer
{
    /*code:释迦苦僧*/ 
    class Program
    {
        static void Main(string[] args)
        {
            /*创建HTTP通道*/
            HttpChannel channel = new HttpChannel(8226);        
            /*注册通道服务端*/
            ChannelServices.RegisterChannel(channel,false);
            RemotingConfiguration.ApplicationName = "test";
            RemotingConfiguration.RegisterActivatedServiceType(typeof(TestMessageMarshal));   
            Console.WriteLine("started ..."); 
            /*接收客户端事件*/ 
            TestMessageMarshal.SendMessageEvent+=new SendMessageHandler(TestMessageMarshal_SendMessageEvent);
            Console.Read();
        }
         
        static void TestMessageMarshal_SendMessageEvent(string messge)
        {
            Console.WriteLine(messge);
        }
    }
}
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.RegisterActivatedClientType(typeof(MessageMarshal.TestMessageMarshal), "http://localhost:8226/test");
            /*创建消息实体*/
            MessageMarshal.TestMessageMarshal TestMessage = new MessageMarshal.TestMessageMarshal();
            while (true)
            {
                TestMessage.SendMessage("DateTime.Now:" + System.DateTime.Now.ToString());
                Console.WriteLine("send message...");
                Thread.Sleep(2000);
            }
        }
    }
}

 

posted @ 2018-02-13 10:09  sky20080101  阅读(209)  评论(0)    收藏  举报