基于ajax与msmq技术的消息推送功能实现代码


Posted in Javascript onDecember 26, 2016

周末在家捣鼓了一下消息推送的简单例子,其实也没什么技术含量,欢迎大伙拍砖。

我设计的这个推送demo是基于ajax长轮询+msmq消息队列来实现的,具体交互过程如下图:

基于ajax与msmq技术的消息推送功能实现代码

先说说这个ajax长轮询,多长时间才算长呢?这个还真不好界定。

这里是相对普通ajax请求来说的,通常处理一个请求也就是毫秒级别的时间。但是这里的长轮询方式

在ajax发送请求给服务器之后,服务器给调用端返回数据的时间多长那可还真不好说。嘿嘿,这关键要看

我们啥时候往msmq队列中推送数据了,先看看推送的效果图吧。。。。。

基于ajax与msmq技术的消息推送功能实现代码

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

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

消息推送Winform程序代码

namespace SenderApp
{
  public partial class Form1 : Form
  {
    private string queueName = @".\Private$\pushQueue";
    private MessageQueue pushQueue = null;
    
    public Form1()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      try
      {
        var queue = this.GetQueue();
        if (string.IsNullOrEmpty(this.textBox1.Text)) { this.label1.Text = "推送消息不能为空"; return; }
        queue.Send(this.textBox1.Text, "messagePush");
        this.label1.Text = "消息推送成功";
      }
      catch (Exception ex)
      {
        this.label1.Text = string.Format("消息推送失败:{0}",ex.Message);
      }
    }

    private MessageQueue GetQueue()
    {
      if (this.pushQueue == null)
      {
        if (!MessageQueue.Exists(queueName))
        {
          this.pushQueue = MessageQueue.Create(queueName);
        }
        else
        {
          this.pushQueue = new MessageQueue(queueName);
        }
      }
      return this.pushQueue;
    }

    private void textBox1_MouseDown(object sender, MouseEventArgs e)
    {
      this.textBox1.Text = "";
      this.label1.Text = "推送状态";
    }
  }
}

Web服务端代码

namespace MessagePushWeb.Controllers
{
  public class HomeController : Controller
  {
    private static string queueName = @".\Private$\pushQueue";
    private static MessageQueue pushQueue = null;

    public ActionResult Index()
    {
      return View();
    }

    public async Task<ActionResult> GetMessage()
    {
      string msg = await Task.Run(() => {
        return this.ReadMessage();
      });
      
      return Content(msg);
    }


    private MessageQueue GetQueue()
    {
      if (pushQueue == null)
      {
        if (MessageQueue.Exists(queueName))
        {
          pushQueue = new MessageQueue(queueName);
          pushQueue.Formatter = new XmlMessageFormatter(new string[] { "System.String" });
        }
      }
      return pushQueue;
    }

    private string ReadMessage()
    {
      var queue = GetQueue();
      Message message = queue.Receive();
      return message.Body.ToString();
    }
  }
}

页面视图代码

@{
  ViewBag.Title = "Push";
}


<h2>Push</h2>

<div>接收消息列表</div>
<div id="msg"></div>

<script type="text/javascript">
  $(function () {
    getMessage();
  });


  function getMessage() {
    $.get("/home/getmessage", {}, function (data) {
      var _msg = $("#msg").html();
      $("#msg").html(_msg + "<li>" + data + "</li>");
      getMessage();
    });
   }
</script>

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

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS写的数字拼图小游戏代码[学习参考]
Oct 29 Javascript
document.onreadystatechange事件的用法分析
Oct 17 Javascript
js 字符串转化成数字的代码
Jun 29 Javascript
别了 JavaScript中的isXX系列
Aug 01 Javascript
详解AngularJS过滤器的使用
Mar 11 Javascript
dedecms页面如何获取会员状态的实例代码
Mar 15 Javascript
用JS中split方法实现彩色文字背景效果实例
Aug 24 Javascript
JS中检测数据类型的几种方式及优缺点小结
Dec 12 Javascript
js合并两个数组生成合并后的key:value数组
May 09 Javascript
jQuery模拟html下拉多选框的原生实现方法示例
May 30 jQuery
Vuex中实现数据状态查询与更改
Nov 08 Javascript
微信小程序按顺序同步执行的两种方式
Dec 20 Javascript
Bootstrap源码解读标签、徽章、缩略图和警示框(8)
Dec 26 #Javascript
js正则表达式惰性匹配和贪婪匹配用法分析
Dec 26 #Javascript
Bootstrap的modal拖动效果
Dec 25 #Javascript
原生ajax处理json格式数据的实例代码
Dec 25 #Javascript
JS异步文件分片断点上传的实现思路
Dec 25 #Javascript
BootStrop前端框架入门教程详解
Dec 25 #Javascript
半个小时学json(json传递示例)
Dec 25 #Javascript
You might like
关于BIG5-HKSCS的解决方法
2007/03/20 PHP
php与flash as3 socket通信传送文件实现代码
2014/08/16 PHP
PHP简单计算两个时间差的方法示例
2017/06/20 PHP
PHP基于socket实现的简单客户端和服务端通讯功能示例
2017/07/10 PHP
浅析PHP中的 inet_pton 网络函数
2019/12/16 PHP
JS实现浏览器菜单命令
2006/09/05 Javascript
JavaScript-世界上误解最深的语言分析
2007/08/12 Javascript
javascript脚本调试方法小结
2008/11/24 Javascript
Firefox中autocomplete=&quot;off&quot; 设置不起作用Bug的解决方法
2011/03/25 Javascript
javascript通过className来获取元素的简单示例代码
2014/01/10 Javascript
js 实现浏览历史记录示例
2014/04/20 Javascript
Window.Open如何在同一个标签页打开
2014/06/20 Javascript
JS实现动态给图片添加边框的方法
2015/04/01 Javascript
基于jquery实现简单的分页控件
2016/03/17 Javascript
Bootstrap基本组件学习笔记之导航(10)
2016/12/07 Javascript
ajax与json 获取数据并在前台使用简单实例
2017/01/19 Javascript
Angular使用过滤器uppercase/lowercase实现字母大小写转换功能示例
2018/03/27 Javascript
如何基于原生javaScript生成带图片的二维码
2019/11/21 Javascript
JS数组进阶示例【数组的几种函数用法】
2020/01/16 Javascript
[55:39]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第二场 1月19日
2021/03/11 DOTA
利用Python演示数型数据结构的教程
2015/04/03 Python
用Python中的字典来处理索引统计的方法
2015/05/05 Python
Python使用MYSQLDB实现从数据库中导出XML文件的方法
2015/05/11 Python
Python中exit、return、sys.exit()等使用实例和区别
2015/05/28 Python
Python 的类、继承和多态详解
2017/07/16 Python
Python实现压缩和解压缩ZIP文件的方法分析
2017/09/28 Python
pygame游戏之旅 载入小车图片、更新窗口
2018/11/20 Python
python爬虫增加访问量的方法
2019/08/22 Python
Django获取应用下的所有models的例子
2019/08/30 Python
Python Flask上下文管理机制实例解析
2020/03/16 Python
Python常用类型转换实现代码实例
2020/07/28 Python
Python爬虫后获取重定向url的两种方法
2021/01/19 Python
荷兰网上买鞋:MooieSchoenen.nl
2017/09/12 全球购物
工程部经理岗位职责
2013/12/08 职场文书
公司授权委托书
2014/04/04 职场文书
优秀教师个人总结
2015/02/11 职场文书