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来发送针对所有人, 服务器, 和个人的消息了.

  • 相关阅读:
    e667. 在给定图像中创建缓冲图像
    e661. 确定图像中是否有透明像素
    e673. Getting Amount of Free Accelerated Image Memory
    e663. 在gif图像中获取透明和色彩的数量
    e662. 取的图像的色彩模型
    e675. 翻转缓冲图像
    e665. 在图像中过滤三元色
    e679. 浮雕化图像
    e669. 绘制缓冲图像
    e664. 在图像中获取子图像
  • 原文地址:https://www.cnblogs.com/egmkang/p/7449590.html
Copyright © 2011-2022 走看看