.NET Remoting服务器端订阅客户端事件

来源:互联网 发布:计算机技术专硕 网络 编辑:程序博客网 时间:2024/05/17 00:50

 模拟情景:在天龙八部中,有信使通知住持,说,带头大哥说契丹人要来抢经书了。客户端订阅服务器端事件,于是向服务器端发送消息。

1.服务器端代码,设计服务器端要提供的服务

namespace RemotingLib
{
    /// <summary>
    /// 拨通电话的委托,
    /// </summary>
    /// <param name="msg">电话中要传输的消息</param>
    public delegate void PhoneUpEventHandler(string msg);

    public interface ICall
    {
        void PhoneUp(string msg);
    }

    public class RemotePhone : MarshalByRefObject, ICall
    {
        public static event PhoneUpEventHandler PhoneUpEvent;

        #region ICall 成员

        public void PhoneUp(string msg)
        {
                  PhoneUpEvent(msg);
        }

        #endregion

        /// <summary>
        /// 设置对象的生命周期无限大。意味着这个远程对象始终处于激活状态,以便能够激活事件
        /// </summary>
        /// <returns></returns>
        public override object InitializeLifetimeService()
        {
            return null;
        }
    }

}

2.将提供服务的对象公布出来

class Program
    {
        static int count = 0;

        static void Main(string[] args)
        {

            //1.注册通信通道
            TcpChannel tChannel = new TcpChannel(8888);
            ChannelServices.RegisterChannel(tChannel);

            //2.在通道中注册对象,不同的激活方式对应不同的注册方式
            //服务端激活
            RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemotePhone), "yoyo", WellKnownObjectMode.Singleton);
            RemotePhone.PhoneUpEvent += new PhoneUpEventHandler(RemotePhone_PhoneUpEvent);
            Console.WriteLine(DateTime.Now);

            Console.ReadKey();
        }

        static void RemotePhone_PhoneUpEvent(string msg)
        {
            count+=1;
            Console.WriteLine("第" + count + "个人说:" + msg);
        }
    }

3.客户端调用远程对象代码

class Program
    {
        static void Main(string[] args)
        {
            //注意:客户端不能使用端口号,否则报错:套接字遇到一个已死的网络
            TcpChannel tChannel = new TcpChannel();
            ChannelServices.RegisterChannel(tChannel);

            ICall call = (ICall)Activator.GetObject(typeof(ICall), "tcp://localhost:8888/yoyo");

            call.PhoneUp("住持,带头大哥说契丹人要来抢经书了");
            Console.ReadKey();
        }
    }

 

原创粉丝点击