zoukankan      html  css  js  c++  java
  • .NET Remoting Basic(8)事件

        远程事件也需要转化成消息,所以也需要加事件委托继承自MarshalByRefObject。实际操作如下

    1.定义接口

    public delegate void MessageArrivedHandler(String msg);
     
     public interface IBroadcaster {
         void BroadcastMessage(String msg);
         event MessageArrivedHandler MessageArrived;
     }


    2.服务器端实现

    public class Broadcaster: MarshalByRefObject, IBroadcaster
         {
     
             public event General.MessageArrivedHandler MessageArrived;
     
             public void BroadcastMessage(string msg) {
                 // call the delegate to notify all listeners
                 Console.WriteLine("Will broadcast message: {0}");
                 MessageArrived(msg);
             }
     
             public override object InitializeLifetimeService() {
                 // this object has to live "forever"
                 return null;
             }
         }
     
     
         class ServerStartup
         {
             static void Main(string[] args)
             {
                 String filename = "server.exe.config";
                 RemotingConfiguration.Configure(filename);
     
                 Console.WriteLine ("Server started, press <return> to exit.");
                 Console.ReadLine();
             }
         }


    上面两步没多大悬念,关键在客户端

    3.客户端实现

    3.1定义一个继承自MarshalByRefObject的委托方法

    public class EventHandler: MarshalByRefObject {
         public void HandleMessage(String msg) {
             Console.WriteLine("Received: {0}",msg);
         }
     
         public override object InitializeLifetimeService() {
             // this object has to live "forever"
             return null;
         }    
     }


    3.2调用事件时,委托接收的方法应是继承自MarshalByRefObject的方法

    static void Main(string[] args)
     {
         String filename = "eventlistener.exe.config";
         RemotingConfiguration.Configure(filename);
     
         IBroadcaster bcaster = 
             (IBroadcaster) RemotingHelper.GetObject(typeof(IBroadcaster));
     
         Console.WriteLine("Registering event at server");
     
         // callbacks can only work on MarshalByRefObjects, so 
         // I created a different class for this as well
         EventHandler eh = new EventHandler();
         bcaster.MessageArrived += 
             new MessageArrivedHandler(eh.HandleMessage);
     
         Console.WriteLine("Event registered. Waiting for messages.");
         Console.ReadLine();
     }

    上面的方法将会报错

    image_2

    在中间层加入一个事件,由事件触发获取内部委托,由内部对象触发事件,不可以直接触发,一定要在中间层,不可以直接在客户端添加

    public class BroadcastEventWrapper : MarshalByRefObject
     {
         public event MessageArrivedHandler MessageArrivedLocally;
         [OneWay]
         public void LocallyHandleMessageArrived(String msg)
         {
             // forward the message to the client
             MessageArrivedLocally(msg);
         }
         public override object InitializeLifetimeService()
         {
             // this object has to live "forever"
             return null;
         }
     }


    调整后如下

    static void Main(string[] args)
     {
         String filename = "eventlistener.exe.config";
         RemotingConfiguration.Configure(filename);
     
         IBroadcaster bcaster = 
             (IBroadcaster) RemotingHelper.GetObject(typeof(IBroadcaster));
         BroadcastEventWrapper eventWrapper =new BroadcastEventWrapper();
         // register the local handler with the "remote" handler
         eventWrapper.MessageArrivedLocally +=new MessageArrivedHandler(HandleMessage);
         Console.WriteLine("Registering event at server");
         bcaster.MessageArrived +=new MessageArrivedHandler(eventWrapper.LocallyHandleMessageArrived);
         Console.WriteLine("Event registered. Waiting for messages.");
         Console.ReadLine();
     }
     public static void HandleMessage(String msg)
     {
         Console.WriteLine("Received: {0}", msg);
     }
  • 相关阅读:
    SorceTree 与 Bitbucket连接
    Android回调事件传播-android学习之旅(四十五)
    USACO Section 2.2 Subset Sums
    多线程计数器——原子操作
    《怪诞经济学》:2星。故意伪装成外国作者和翻译书。作者了解一些经济学结论,但是没受过经济学方面的学术训练。
    《科技失控》:3星。科技可能带给人类的坏的结果的汇总。
    《蚂蚁金服》:3星。支付宝准官修历史。
    《这才是心理学》:心理学常见误解与相关伪科学辨析。反证《巨婴国》作者要么是有意的骗子,要么是心理学差生。5星。
    《哈佛商业评论》2017年第4期:“指导式”销售能将购买便捷度提升86%。4星
    《知识大融通》:在生物、哲学、文化领域旁征博引,但是主题不够明确。3星。
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1809581.html
Copyright © 2011-2022 走看看