zoukankan      html  css  js  c++  java
  • orleans发送广播消息

    一个client发送消息给orleans, 就只需要掉用Grain的函数就行了. 但是有时候Grain需要发送消息给client, 在orleans里面, 就只能通过Observer来实现.

     1 public interface IChat : IGrainObserver
     2 {
     3   void ReceiveMessage(string message);
     4 }
     5 
     6 public class Chat : IChat
     7 {
     8   public void ReceiveMessage(string message)
     9   {
    10     Console.WriteLine(message);
    11   }
    12 }
    13 
    14 class HelloGrain : Grain, IHello
    15 {
    16   private ObserverSubscriptionManager<IChat> _subsManager;
    17   public override async Task OnActivateAsync()
    18   {
    19     _subsManager = new ObserverSubscriptionManager<IChat>();
    20     await base.OnActivateAsync();
    21   }
    22   public async Task Subscribe(IChat observer)
    23   {
    24     _subsManager.Subscribe(observer);
    25   }
    26   public async Task UnSubscribe(IChat observer)
    27   {
    28     _SubsManager.Unsubscribe(observer);
    29   }
    30 }
    31 
    32 public Task SendUpdateMessage(string message)
    33 {
    34   _SubsManager.Notify(s => s.ReceiveMessage(message));
    35   return TaskDone.Done;
    36 }
    37 
    38 //下面就是Grain发送消息给Client的代码
    39 var friend = GrainClient.GrainFactory.GetGrain<IHello>(0);
    40 Chat c = new Chat();
    41 
    42 var obj = await GrainClient.GrainFactory.CreateObjectReference<IChat>(c);
    43 await friend.Subscribe(obj);

    有了上面的代码, 我们就可以按照自己的需求造一个广播出来.

    • 发送消息给Client上所有的人
    • 发送消息给Client上某一部分人
    • 发送消息给Client上某一个人
     1 enum DestType
     2 {
     3   DestType_All    = 1,
     4   DestType_Server = 2,
     5   DestType_Player = 3,
     6 }
     7 
     8 //这是我们的观察者
     9 public interface IGatewayObserver : IGrainObserver
    10 {
    11   void SendMessage(int destType, long dest, int msgid, byte[] buffer);
    12 }
    13 
    14 public interface IAllGatewayGrain : IGrainWithIntegerKey
    15 {
    16   //注册网关
    17   Task RegisterGateway(string key);
    18   Task UnRegisterGateway(string key);
    19 
    20   //发送消息
    21   Task SendMessage(int destType, long dest, int msgid, byte[] buffer);
    22 
    23   //注册观察者
    24   Task RegisterObserver(string gateway, IGatewayObserver);
    25 }
    26 
    27 public interface IGatewayGrain : IGrainWithStringKey
    28 {
    29   Task SendMessage(int destType, long dest, int msgid, byte[] buffer);
    30 
    31   Task RegisterObserver(string gateway, IGatewayObserver);
    32 }

    上面是接口的设计, 然后只需要在Client启动的时候, 把自己注册到两个Grain里面去, 然后其他的Grain就可以通过两个Grain来发送针对所有人, 服务器, 和个人的消息了.

  • 相关阅读:
    学习lua(一) 认识了解lua
    Lua For Windows 环境配置及使sciTE支持中文,使用editplus作为编辑工具
    Lua代码实例()
    Lau实例代码(二)
    (转)Nios II的Boot过程分析(I)
    Altera和Xilinx的参考设计资源
    (转)如何在FPGA设计环境中加时序约束
    (转)FPGA时序约束的几种方法
    (转)Nios ii设备管理分析
    (转)Nios II的Boot过程分析(II)
  • 原文地址:https://www.cnblogs.com/egmkang/p/7449590.html
Copyright © 2011-2022 走看看