代码改变世界

.NET Remoting Basic(8)-事件

  Clingingboy  阅读(465)  评论(0编辑  收藏  举报

    远程事件也需要转化成消息,所以也需要加事件委托继承自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);
 }
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2009-08-26 Spring.NET学习笔记(6)-基础AOP
点击右上角即可分享
微信分享提示