复习:在上一篇我介绍了MSF的基本订阅,模式就是,客户端A,订阅服务器。客户端B,订阅服务器。通过服务器广播消息,

所有订阅过的客户端都能接到消息。

进阶:在上一篇的基础上,增加客户端A,发送信息到服务器,服务器把接到的信息,再转发给所有订阅了的客户端。

传送门:框架的获取 http://www.cnblogs.com/bluedoctor/

医生的博客:http://www.pwmis.com/sqlmap/

正文:首先启动服务器,再单击按钮,给所有监听客户端,发送消息。按钮事件的代码如下:

  ServiceRequest request = new ServiceRequest();
request.ServiceName = "TestSendALLClient";
request.MethodName = "SendMsg";
request.Parameters = new object[] {txtsend.Text}; //异步方式测试
Proxy serviceProxy = new Proxy();
serviceProxy.ErrorMessage += new EventHandler<MessageSubscriber.MessageEventArgs>(serviceProxy_ErrorMessage);
serviceProxy.ServiceBaseUri = this.txtSerivceUri.Text; int msgId = serviceProxy.Subscribe<string>(request, DataType.Text, (converter) =>
{
if (converter.Succeed)
{
MyInvoke(this, () =>
{
this.lblResult.Text = converter.Result.ToString(); });
}
else
{
MessageBox.Show(converter.ErrorMessage);
}
});
if (msgId < 1)
{
MessageBox.Show("订阅失败");
}
else
{
this.btnServerTime.Enabled = false;
} }

重点看一下这里的发送消息给服务器,ServiceName是类的名字,MethodName 是方法的名字,Parameters 是需要传给服务器的参数。

这个类、和函数是参考订阅闹钟的的功能来做的。最后在配置文件中注册刚刚写的类。运行后,看到,客户端发送的消息,已经被服务器

接收到了,并分发给订阅的客户端了。

  request.ServiceName = "TestSendALLClient";
request.MethodName = "SendMsg";
request.Parameters = new object[] {txtsend.Text};

   public ServiceEventSource SendMsg(string msg)
{
return new ServiceEventSource(timer,,() => {
//要初始化执行的代码或者方法 //publishCount = 0;
//this.AlarmTime = targetTime;
//timer.Start(); CurrentContext.PublishData(msg); //如果上面的代码是一个执行时间比较长的方法,但又不知道何时执行完成,
//并且不想等待超时回收服务对象,而是在执行完成后立即回收服务对象,可以调用下面的代码:
//CurrentContext.PublishEventSource.DeActive();
//注意:调用DeActive 方法后将会停止事件推送,所以请注意此方法调用的时机。 //下面代码仅做测试,查看服务事件源对象的活动生命周期
//在 ActiveLife 时间之后,一直没有事件推送,则事件源对象被视为非活动状态,发布工作线程会被回收。
//在本例中,ActiveLife 为ServiceEventSource 构造函数的第二个参数,值为 2分钟,可以通过下面一行代码证实:
int life = CurrentContext.PublishEventSource.ActiveLife; //如果上面执行的是一个执行时间比较长的方法,并且有返回值,想将返回值也推送给订阅端,可以再次执行CurrentContext.PublishData
//CurrentContext.PublishData(DateTime.Now); //如果事件推送结束,需要设置事件源为非活动状态,否则,需要等待 ActiveLife 时间之后自然过期成为非活动状态。
//如果你无法确定事件推送何时结束,请不要调用下面的方法
//CurrentContext.PublishEventSource.DeActive();
});
}

      <Add Key="TestSendALLClient" InterfaceName="IService" FullClassName="ServiceSample.TestSendALLClient" Assembly="ServiceSample" />

SOD开源框架MSF(消息服务框架)进阶篇的更多相关文章

  1. “一切都是消息”--MSF(消息服务框架)入门简介

    “一切都是消息”--这是MSF(消息服务框架)的设计哲学. MSF的名字是 Message Service Framework 的简称,中文名称:消息服务框架,它是PDF.NET框架的一部分. 1,M ...

  2. 消息服务框架(MSF)应用实例之分布式事务三阶段提交协议的实现

    一,分布式事务简介 在当前互联网,大数据和人工智能的热潮中,传统企业也受到这一潮流的冲击,纷纷响应国家“互联网+”的战略号召,企业开始将越来越多的应用从公司内网迁移到云端和移动端,或者将之前孤立的IT ...

  3. 使用“消息服务框架”(MSF)实现分布式事务的三阶段提交协议(电商创建订单的示例)

    1,示例解决方案介绍 在上一篇 <消息服务框架(MSF)应用实例之分布式事务三阶段提交协议的实现>中,我们分析了分布式事务的三阶段提交协议的原理,现在我们来看看如何使用消息服务框架(MSF ...

  4. “一切都是消息”--MSF(消息服务框架)之【请求-响应】模式

    在前一篇, “一切都是消息”--MSF(消息服务框架)入门简介, 我们介绍了MSF基于异步通信,支持请求-响应通信模式和发布-订阅通信模式,并且介绍了如何获取MSF.今天,我们来看看如何使用MSF来做 ...

  5. “一切都是消息”--MSF(消息服务框架)之【发布-订阅】模式

    在上一篇,“一切都是消息”--MSF(消息服务框架)之[请求-响应]模式 ,我们演示了MSF实现简单的请求-响应模式的示例,今天来看看如何实现[发布-订阅]模式.简单来说,该模式的工作过程是: 客户端 ...

  6. “一切都是消息”--iMSF(即时消息服务框架)入门简介

    “一切都是消息”--这是iMSF(即时消息服务框架)的设计哲学. MSF的名字是 Message Service Framework 的简称,由于目前框架主要功能在于处理即时(immediately) ...

  7. 即时消息服务框架(iMSF)应用实例之分布式事务三阶段提交协议的实现

    一,分布式事务简介 在当前互联网,大数据和人工智能的热潮中,传统企业也受到这一潮流的冲击,纷纷响应国家“互联网+”的战略号召,企业开始将越来越多的应用从公司内网迁移到云端和移动端,或者将之前孤立的IT ...

  8. “一切都是消息”--iMSF(即时消息服务框架)之【发布-订阅】模式

    MSF的名字是 Message Service Framework 的简称,由于目前框架主要功能在于处理即时(immediately)消息,所以iMSF就是 immediately Message S ...

  9. “一切都是消息”--iMSF(即时消息服务框架)之【请求-响应】模式(点对点)

    MSF的名字是 Message Service Framework 的简称,由于目前框架主要功能在于处理即时(immediately)消息,所以iMSF就是 immediately Message S ...

  10. Dapeng框架-开源高性能分布式微服务框架

    我们公司性质是新零售,公司也有专门的框架组.这群大牛自己开发了一整套分布式微服务框架.我们也在使用这套框架,有很多心得体会. 该框架既Dapeng也!开源github地址:https://github ...

随机推荐

  1. 智能指针剖析(上)std::auto_ptr与boost::scoped_ptr

    1. 引入 C++语言中的动态内存分配没有自动回收机制,动态开辟的空间需要用户自己来维护,在出函数作用域或者程序正常退出前必须释放掉. 即程序员每次 new 出来的内存都要手动 delete,否则会造 ...

  2. JavaScript算法 ,Python算法,Go算法,java算法,系列之【归并排序】篇

    常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等.用一张图概括: 归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的 ...

  3. [刷题]Google Code Jam 2017 - Round1 C Problem A. Ample Syrup

    https://code.google.com/codejam/contest/3274486/dashboard Problem The kitchen at the Infinite House ...

  4. 通过js给网页加上水印背景

    有些后端管理系统,因为业务逻辑的需要,需要加上水印,下面就是水印方法. function watermark(settings) { debugger; //默认设置 var defaultSetti ...

  5. php.ini 文件中配置的意义注释

    ;;;;;;;;;;;;;;;;;;;; About php.ini   ;  //关于php;;;;;;;;;;;;;;;;;;;; PHP's initialization file, gener ...

  6. PHP中的运算符

    一.算术运算符   运算符 名称 描述 实例 结果 x + y 加 x 和 y 的和 2 + 2 4 x - y 减 x 和 y 的差 5 - 2 3 x * y 乘 x 和 y 的积 5 * 2 1 ...

  7. 镜像命名的最佳实践 - 每天5分钟玩转 Docker 容器技术(18)

    我们已经学会构建自己的镜像了.接下来的问题是如何在多个 Docker Host 上使用镜像. 这里有几种可用的方法: 用相同的 Dockerfile 在其他 host 构建镜像. 将镜像上传到公共 R ...

  8. PC端网页的基本构成

    首先,一个前端最基本的就是排网页,有人会看不起拍页面,认为不就是排一个页面嘛,有啥的,分分钟的事,可是他不知道的是,一个网页中也包含了很多内容,像我们如果不理解margin,padding,会经常对我 ...

  9. 简单的用jQuery做遮罩效果

    <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...

  10. 开源网络操作系统--VyOS

    User Guide Jump to: navigation, search Contents 1 Introduction 2 Installation 3 Using the Command-Li ...