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

 public interface IChat : IGrainObserver
{
void ReceiveMessage(string message);
} public class Chat : IChat
{
public void ReceiveMessage(string message)
{
Console.WriteLine(message);
}
} class HelloGrain : Grain, IHello
{
private ObserverSubscriptionManager<IChat> _subsManager;
public override async Task OnActivateAsync()
{
_subsManager = new ObserverSubscriptionManager<IChat>();
await base.OnActivateAsync();
}
public async Task Subscribe(IChat observer)
{
_subsManager.Subscribe(observer);
}
public async Task UnSubscribe(IChat observer)
{
_SubsManager.Unsubscribe(observer);
}
} public Task SendUpdateMessage(string message)
{
_SubsManager.Notify(s => s.ReceiveMessage(message));
return TaskDone.Done;
} //下面就是Grain发送消息给Client的代码
var friend = GrainClient.GrainFactory.GetGrain<IHello>();
Chat c = new Chat(); var obj = await GrainClient.GrainFactory.CreateObjectReference<IChat>(c);
await friend.Subscribe(obj);

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

  • 发送消息给Client上所有的人
  • 发送消息给Client上某一部分人
  • 发送消息给Client上某一个人
 enum DestType
{
DestType_All = ,
DestType_Server = ,
DestType_Player = ,
} //这是我们的观察者
public interface IGatewayObserver : IGrainObserver
{
void SendMessage(int destType, long dest, int msgid, byte[] buffer);
} public interface IAllGatewayGrain : IGrainWithIntegerKey
{
//注册网关
Task RegisterGateway(string key);
Task UnRegisterGateway(string key); //发送消息
Task SendMessage(int destType, long dest, int msgid, byte[] buffer); //注册观察者
Task RegisterObserver(string gateway, IGatewayObserver);
} public interface IGatewayGrain : IGrainWithStringKey
{
Task SendMessage(int destType, long dest, int msgid, byte[] buffer); Task RegisterObserver(string gateway, IGatewayObserver);
}

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

orleans发送广播消息的更多相关文章

  1. udp发送广播消息

    import socket if __name__ == '__main__': # 创建udpsocket udp_socket = socket.socket(socket.AF_INET, so ...

  2. Linux--网络通信命令(给其它用户发送广播消息)

    1.命令名称:write 执行权限:所有用户  功能描述:向另外一个用户发送信息,以CTRL+D作为结束 语法:write <用户名>root向luxh用户发送信息[root@localh ...

  3. C#利用UdpClient发送广播消息

    首先写个接受消息的客户端.这里偷了点懒,new UdpClient(11000)就是用Udp方式侦听11000端口,侦听任何发送到11000端口的消息都会接收到. 代码 : ); Byte[] sen ...

  4. Linux下UDP收/发广播消息简单实现

    发送广播消息 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/typ ...

  5. Linux系统下UDP发送和接收广播消息小例子

    // 发送端 #include <iostream> #include <stdio.h> #include <sys/socket.h> #include < ...

  6. Unity3D笔记九 发送广播与消息、利用脚本控制游戏

    一.发送广播与消息 游戏对象之间发送的广播与消息分为三种:第一种向子对象发送,将发送至该对象的同辈对象或者子孙对象中:第二种为给自己发送,发送至自己本身对象:第三种为向父对象发送,发送至该对象的同辈或 ...

  7. 发送广播BroadcastReceiver

    import android.os.Bundle;import android.app.Activity;import android.content.Intent;import android.vi ...

  8. android在广播接收器BroadcastReceiver里面再进行发送广播,造成当前广播接收器不断循环执行问题

    最近在公司处理项目时,用到锁屏状态弹出activity进行提示,类似QQ消息弹屏提示的功能.当中用到了,假如该弹出activity已经位于锁屏界面外时,将不进行再次弹窗,而是发送广播进行通知数据更新, ...

  9. Android应用程序发送广播(sendBroadcast)的过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6744448 前面我们分析了Android应用程 ...

随机推荐

  1. The server principal "sa" is not able to access the database "xxxx" under the current security context

    在SQL Server服务器上一个作业执行时,遇到下面错误信息: Message: Executed as user: dbo. The server principal "sa" ...

  2. java----堆区、方法区和栈区

    堆区:只存放类对象,线程共享: 方法区:又叫静态存储区,存放class文件和静态数据,线程共享; 栈区:存放方法局部变量,基本类型变量区.执行环境上下文.操作指令区,线程不共享; class A { ...

  3. mysql中导入导出sql文件

    1.导出整个数据库: mysqldump -u用户名 -p密码 数据库名 > 导出的文件名 例:mysqldump -uroot -proot user > user.sql 2.导出一个 ...

  4. python3+beautifulsoup4爬取汽车信息

    import requests from bs4 import BeautifulSoup response = requests.get("https://www.autohome.com ...

  5. 设置Linux环境变量的方法和区别_Ubuntu

    设置 Linux 环境变量可以通过 export 实现,也可以通过修改几个文件来实现,有必要弄清楚这两种方法以及这几个文件的区别. 通过文件设置 Linux 环境变量 首先是设置全局环境变量,对所有用 ...

  6. 解决git push时发现有超过100M的文件时,删除文件后,发现还是提交不上去的问题

    我这里故意放了一个超过100M的文件 后续,git add ,git commit 然后,git push 此时会发现出现了错误.如果,我们再这里直接在文件系统中删除这个大的文件,然后再次提交,会发现 ...

  7. [WeChall] Training: Encodings I (Training, Encoding)

    Training: Encodings I (Training, Encoding) We intercepted this message from one challenger to anothe ...

  8. spark program guide

    概述 Spark 应用由driver program 组成,driver program运行用户的主函数,在集群内并行执行各种操作 主要抽象RDD: spark提供RDD,是贯穿整个集群中所有节点的分 ...

  9. vue事件绑定处理

    事件监听指令 v-on 指令监听 DOM 事件来触发一些 JavaScript 代码,通常是触发一个函数,简写@ <template> <div id="app" ...

  10. POJ 3970(最小公倍数LCM)

    版权声明:Site:https://skyqinsc.github.io/ https://blog.csdn.net/u013986860/article/details/26182055  知 ...