周末在家捣鼓了一下消息推送的简单例子,其实也没什么技术含量,欢迎大伙拍砖。
我设计的这个推送demo是基于ajax长轮询+msmq消息队列来实现的,具体交互过程如下图:

先说说这个ajax长轮询,多长时间才算长呢?这个还真不好界定。
这里是相对普通ajax请求来说的,通常处理一个请求也就是毫秒级别的时间。但是这里的长轮询方式
在ajax发送请求给服务器之后,服务器给调用端返回数据的时间多长那可还真不好说。嘿嘿,这关键要看
我们啥时候往msmq队列中推送数据了,先看看推送的效果图吧。。。。。

抱歉,没弄张动态效果图给大家。实现的功能大体上就是这样。上图中的winform程序中我们点击即刻发送按钮,同时网页上我们就能看到新推送的数据。

好了,说完具体实现流程和效果之后马上就开始编码实现吧。。。。

  1. namespace SenderApp
  2. {
  3. public partial class Form1 : Form
  4. {
  5. private string queueName = @".\Private$\pushQueue";
  6. private MessageQueue pushQueue = null;
  7.  
  8. public Form1()
  9. {
  10. InitializeComponent();
  11. }
  12.  
  13. private void button1_Click(object sender, EventArgs e)
  14. {
  15. try
  16. {
  17. var queue = this.GetQueue();
  18. if (string.IsNullOrEmpty(this.textBox1.Text)) { this.label1.Text = "推送消息不能为空"; return; }
  19. queue.Send(this.textBox1.Text, "messagePush");
  20. this.label1.Text = "消息推送成功";
  21. }
  22. catch (Exception ex)
  23. {
  24. this.label1.Text = string.Format("消息推送失败:{0}",ex.Message);
  25. }
  26. }
  27.  
  28. private MessageQueue GetQueue()
  29. {
  30. if (this.pushQueue == null)
  31. {
  32. if (!MessageQueue.Exists(queueName))
  33. {
  34. this.pushQueue = MessageQueue.Create(queueName);
  35. }
  36. else
  37. {
  38. this.pushQueue = new MessageQueue(queueName);
  39. }
  40. }
  41. return this.pushQueue;
  42. }
  43.  
  44. private void textBox1_MouseDown(object sender, MouseEventArgs e)
  45. {
  46. this.textBox1.Text = "";
  47. this.label1.Text = "推送状态";
  48. }
  49. }
  50. }

消息推送Winform程序代码

  1. namespace MessagePushWeb.Controllers
  2. {
  3. public class HomeController : Controller
  4. {
  5. private static string queueName = @".\Private$\pushQueue";
  6. private static MessageQueue pushQueue = null;
  7.  
  8. public ActionResult Index()
  9. {
  10. return View();
  11. }
  12.  
  13. public async Task<ActionResult> GetMessage()
  14. {
  15. string msg = await Task.Run(() => {
  16. return this.ReadMessage();
  17. });
  18.  
  19. return Content(msg);
  20. }
  21.  
  22. private MessageQueue GetQueue()
  23. {
  24. if (pushQueue == null)
  25. {
  26. if (MessageQueue.Exists(queueName))
  27. {
  28. pushQueue = new MessageQueue(queueName);
  29. pushQueue.Formatter = new XmlMessageFormatter(new string[] { "System.String" });
  30. }
  31. }
  32. return pushQueue;
  33. }
  34.  
  35. private string ReadMessage()
  36. {
  37. var queue = GetQueue();
  38. Message message = queue.Receive();
  39. return message.Body.ToString();
  40. }
  41. }
  42. }

Web服务端代码

  1. @{
  2. ViewBag.Title = "Push";
  3. }
  4.  
  5. <h2>Push</h2>
  6.  
  7. <div>接收消息列表</div>
  8. <div id="msg"></div>
  9.  
  10. <script type="text/javascript">
  11. $(function () {
  12. getMessage();
  13. });
  14.  
  15. function getMessage() {
  16. $.get("/home/getmessage", {}, function (data) {
  17. var _msg = $("#msg").html();
  18. $("#msg").html(_msg + "<li>" + data + "</li>");
  19. getMessage();
  20. });
  21. }
  22. </script>

页面视图代码

当然,在这个只是一个初级的消息推送demo,是否能胜任生产环境的需要还有待考证。

如果你也有更好的实现和建议,都欢迎留言给我。

源码在这里:http://pan.baidu.com/s/1pKOPHY7

基于ajax与msmq技术的消息推送功能实现的更多相关文章

  1. ZH奶酪:基于ionic.io平台的ionic消息推送功能实现

    Hybrid App越来越火,Ionic的框架也逐渐被更多的人熟知. 在mobile app中,消息推送是很必要的一个功能. 国内很多ionic应用的推送都是用的极光推送,最近研究了一下Ionic自己 ...

  2. 拾人牙慧篇之——基于HTML5中websocket来实现消息推送功能

    一.写在前面 要求做一个,后台发布信息,前台能即时得到通知的消息推送功能.网上搜了也有很多方式,ajax的定时询问,Comet方式,Server-Sent方式,以及websocket.表示除了定时询问 ...

  3. 基于FCM的消息推送功能

    需求背景 我方项目需要支持客户端消息推送,iOS终端可以借由苹果本身的apns很方便的实现,但是对于Android来说,必须集成第三方的SDK来处理.考虑到项目需要以及成本,我们选择使用谷歌的FCM框 ...

  4. MQTT是IBM开发的一个即时通讯协议,构建于TCP/IP协议上,是物联网IoT的订阅协议,借助消息推送功能,可以更好地实现远程控制

    最近一直做物联网方面的开发,以下内容关于使用MQTT过程中遇到问题的记录以及需要掌握的机制原理,主要讲解理论. 背景 MQTT是IBM开发的一个即时通讯协议.MQTT构建于TCP/IP协议上,面向M2 ...

  5. 采用PopupWin控制消息推送功能

    最近的项目需要,急需实现消息推送功能.接连试了很多办法,让我们用JavaScript为了实现啊,其效果是不咋好,最后,我发现了一个PopupWin这个,看着眼前的成绩不错,开始使用. 1.准备工作.先 ...

  6. umeng友盟消息推送功能集成

    umeng友盟消息推送功能集成(本人使用的是eclipse开发) 1.首先请自行观看友盟消息推送集成的API文档. 观看地址如下: http://dev.umeng.com/push/android/ ...

  7. xamarin.android 消息推送功能--极光推送

    最近在使用xamarin.android的消息推送功能,官方使用的例子是FCM方式,按照官方文档,使用FQ软件是可以成功的,但是在国内由于众所周知的原因,在国内服务并不能使用,于是查找国内各自推送平台 ...

  8. APP消息推送功能

    1.APP内部最好设计-我的消息-的功能,以便用户查看推送消息历史记录,通过角标.已读.未读等设计吸引用户读取消息.(画下来这都是重点) 2.建议提供推送设置功能,允许用户设置推送消息是否显示于通知栏 ...

  9. 基于EasyDarwin EasyPusher实现Android手机直播推送功能

    EasyPusher直播推送在之前就已经稳定支持了Windows.Linux.ARM上的RTSP直播推送功能,配合EasyDarwin开源流媒体服务器,延时基本在1s以内,这个技术方案经过一年多时间, ...

随机推荐

  1. ATM+购物车

    本次代码的实现用到了模块间的互相调用,这对于初学者而言有些难度,不过这也是我们必须要掌握的,在以后的大程序中,多个模块会让我们的代码看起来简洁明了,易排错 (本次代码只是简单的实现的基本的功能,其代码 ...

  2. [转]DDD领域驱动设计基本理论知识总结

    领域驱动设计之领域模型 加一个导航,关于如何设计聚合的详细思考,见这篇文章. 2004年Eric Evans 发表Domain-Driven Design –Tackling Complexity i ...

  3. 关于Knockout的开始

    最近看了汤姆大叔的Knockout,感到MVVM的神奇,也许这就是以后编程的方式,最直观的感觉就是层次更分明了. 绑定,模型转换,监控,在我来说,这算是编程上的一个转变,在以后我做不定期的更新一些MV ...

  4. AOJ 0033 Ball【DFS】

    有一个筒,从A口可以放球,放进去的球可通过挡板DE使其掉进B管或C管里,现有带1-10标号的球按给定顺序从A口放入,问是否有一种控制挡板的策略可以使B管和C管中的球从下往上标号递增. 输入: 第一行输 ...

  5. Mvc HtmlHelper 方法扩展 DropDownListFor

      项目中遇到表单提交中遇到枚举,忽然想起1年前的1小段代码结合HtmlHelper在扩展一下 便于开发中使用 public static class HtmlHelperExtensions { p ...

  6. FTP上传文件到服务器

    一.初始化上传控件. 1.我们这里用dropzone.js作为上传控件,下载地址http://www.dropzonejs.com/ 2.这里我们使用一个div元素作为dropzone载体. < ...

  7. Nginx - Linux下按天分割日志

    待完善. 可参考:https://www.iteblog.com/archives/1244

  8. js和css文件压缩

    压缩网址 http://tool.chinaz.com/tools/jscodeconfusion.aspx http://tool.oschina.net/jscompress?type=3 htt ...

  9. Jstack Jmap jstat

    jstack jmap jstat 代码,这里以这个为例怎样使用jstack诊断Java应用程序故障 public class DeadLock { public static void main(S ...

  10. 面试中常问的有关随机选取k个数的总结

    1.在半径为1的圆中随机选取一点. 2.给定一个未知长度的整数流,如何随机选取一个数 3.给定一个数据流,其中包含无穷尽的搜索关键字(比如,人们在谷歌搜索时不断输入的关键字).如何才能从这个无穷尽的流 ...