本示例借助meteor的一个环境跑,和我们平时用的node自己搭的环境或java,php的环境本质一样,在此不多讨论。

  首先需求是:多系统对接进行消息实时传递。

   安装好mqtt:    npm install mqtt --save

   本地服务(可以直接配在java中):这里采用mosca

  安装好mosca:  npm install mosca --save

var mosca=reqire('mosca');
var mqttServer=new mosca.Server({port:8000});  //设置监听端口
//published监听所发布的消息
mqttServer.on('published',function(packet,client){
  console.log('published----',packet);
  switch(packet.topic){    //topic字段是消息主题,可以理解为接口中的方法名
    case 'test':        //不同的订阅主题,发布消息不同
    console.log(packet.payload.toString());
    mqttServer.publish({topic:'other',payload:'测试不同主题!'});
    break;
    case 'other':
    console.log(packet.paload.toString());
    break;
}
});
//服务开启时给个提示:
mqttServer.on('ready',function(){
  console.log('Mosca server is running ... ');
});

订阅消息(接收):    

var mqtt=require('mqtt');
var client=mqtt.connect('tcp://172.19.5.217:8000');  //本地建立连接
//模拟一个消息发送
var msg={talk:'this is test!!',name:'测试'};
//轮洵发送,仅做测试用,实际场景不需要轮洵
setInterval(function(){
  client.publish('test',JSON.stringify(msg),{qos:1,retain:true});  //发布一条主题为test的消息,
},60000);
client.subscribe('test');  //订阅主题为test的消息
client.on('message',function(topic,message){
  var result=JSON.parse(message.toString());  //接收到新消息,并对其进行处理
  try{
    console.log('result---->',result);     //****do something ****
  }catch(e){
    console.log('error---->',result);
  }
})

  publish()方法接收四个参数publish(topic,message,[options],[callback]);

    topic: 消息主题;

    message:传递的消息;

    options:指定参数值:qos :服务质量级别,默认为0 (消息最多发送一次,不管是否接收到)

               retain:默认为false,推送至当前订阅就释放这条消息。设为true,表示服务器要保留这次推送的信息,如果新的订阅者出现,就把这条消息推送给它。

               dup:保证消息可靠传输,默认为false,只占用一个字节,表示第一次发送。不能用于检测消息重复发送等。注意需要满足以下条件:

              1.当QoS > 0,即消息至少传递一次)

              2.消息需要回复确认。

               此时,在可变头部需要包含消息ID(即client.id)。当值为1时,表示当前消息先前已经被传送过。

    这样一个简单的消息监听功能就做好了,我这边是做一个接收消息自动发送功能,效果如下:

  由于我做即时聊天有用到websocket,与mqtt都是与服务器保持长连接,进行消息传递。那么,来对比一下MQTT和WebSocket有什么区别?

    MQTT具备以下特点:

    1.采用发布/订阅消息传输协议,设计思想开放,简单,轻量。

    2.网络代码高,比较依赖网络。

    3.有三种服务质量:至多一次,只有一次,至少一次。前两者会有风险,后者会负载过重。

    WebSocket的不同在于:

    1.提供使用一个TCP连接进行双向通讯机制,包括网络协议和API,以取代网页和服务器采用HTTP轮询进行双向通讯。

    2.借用HTTP和HTTPS端口,与TCP建立连接和关闭连接时握手。传输消息采用TCP协议。

  具体应用时,我们只需要根据实现场景及两者的特点,选择更合适的通讯方式即可。

  

mqtt实现自动监听服务器消息的更多相关文章

  1. Rabbitmq无法监听后续消息

    现象: 消息队列在处理完一条消息后,无法继续监听后续消息. 首先,系统启动时要启动接收方法如下: protected void Application_Start() { RouteTable.Rou ...

  2. 让webStorm支持自动监听编译scss文件

    前提概要 今日,重装了两波系统,,,之前安装的各种环境都忘光了,重新又踩一次坑的感觉很不舒服,所以记录一下配置自动编译scss一路遇到的坑 一.webstrom run的时候控制台输出的错误中文提示乱 ...

  3. 基于Zookeeper实现客户端动态监听服务器上下线

    一.在具体实现之前,先来了解一下Zookeeper的监听器的原理: 图中Main()线程作为客户端,当在主线程中创建Zookeeper客户端时,会默认创建两个子线程:Listener和connect, ...

  4. Linux下安装oracle遇到启动监听服务器启动失败

    1.发现监听服务器没有启动,则  lsntctl start 启动监听服务器: 2.发现TNS-12555问题: 3.查找TNS-12555错误,找到一个满意的答案: chmod  777 /var/ ...

  5. Jmeter无法监听服务器4444端口

    阿里云服务器开放了4444端口 jmeter还是无法监听: 解决方法: 阿里云安全组添加端口5555 服务器中启动监听插件使用5555端口,使用命令:java -jar ./CMDRunner.jar ...

  6. golang监听rabbitmq消息队列任务断线自动重连接

    需求背景: goalng常驻内存任务脚本监听rbmq执行任务 任务脚本由supervisor来管理 当rabbitmq长时间断开连接会出现如下图 进程处于fatal状态 假如因为不可抗拒因素,rabb ...

  7. 使用Jmeter创建ActiveMQ JMS POINT TO POINT请求,环境搭建、请求创建、插件安装、监听服务器资源等

    转自:http://www.cnblogs.com/qianyiliushang/p/4348584.html 准备工作: 安装JDK,推荐使用1.7以上版本,并设置JAVA_HOME 下载Jmete ...

  8. 转: 使用Jmeter创建ActiveMQ JMS POINT TO POINT请求,环境搭建、请求创建、插件安装、监听服务器资源等

    转自:http://www.cnblogs.com/qianyiliushang/p/4348584.html 准备工作: 安装JDK,推荐使用1.7以上版本,并设置JAVA_HOME 下载Jmete ...

  9. 【转】]监听SMS消息/编程实现短信拦截

    当设备接收到一条新的SMS消息时,就会广播一个包含了android.provider.Telephony.SMS_RECEIVED动作的Intent.注意,这个动作是一个字符串值,SDK 1.0不再包 ...

随机推荐

  1. inet_ntoa将客户端的IP和port写入M…

    问题:inet_ntoa将客户端的IP和port写入MYSQL中的解决方法和遇到的问题

  2. keilc 4 编译出现的几个错误…

    原文地址:keilc 4 编译出现的几个错误解决作者:黑子     今天安装了keilc4,因为项目用到,所以把遇到的几个编译错误解决方法说说,第一次写东西不知道写啥!!    一  第一个是错误提示 ...

  3. POJ 2386 Lake Counting (简单深搜)

    Description Due to recent rains, water has pooled in various places in Farmer John's field, which is ...

  4. NYOJ--325--深度优先搜索--zb的生日

    /* Name: NYOJ--325--zb的生日 Author: shen_渊 Date: 15/04/17 08:18 Description: 输入时计算总质量,DFS搜索和总质量差值一般最接近 ...

  5. mysql存储过程详细讲解及完整实例下载

    一.存储过程概念 1.存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集.经编译后存储在数据库 中. 2.存储过程是数据库中的一个重要对象,用户通过指定存储过程的名字并给 ...

  6. python伪装浏览器爬虫

    待完善 import urllib2,urllib,cookielib urllib.getproxies_registry=lambda:{} request=urllib2.Request(&qu ...

  7. Angular 小试牛刀[2]:CI(travie+firebase)

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每次集成都通过自动化的构建 ...

  8. C++新建Dialog程序

    1.新建: IDE VS2013 新建项目|C++|MFC,选择“基于对话框” 2.为Dialog添加类 在Dialog(界面)上右键,选择“添加类”,然后再弹出界面输入类名即可. 为什么要添加类? ...

  9. Java字符串操作

    最近翻看之前的东西,发现有些看似简单的东西竟然忘的差不多了,记录一下对字符串大小写转换的操作. 打印结果

  10. iostat磁盘IO命令详解

    Linux IO 实时监控iostat命令详解 简介: 对于I/O-bond类型的进程,我们经常用iostat工具查看进程IO请求下发的数量.系统处理IO请求的耗时,进而分析进程与操作系统的交互过程中 ...