Flutter中Stomp-Websocket客户端之JStomp使用

《项目Github地址》https://github.com/jingzhanwu/flutter_jstomp

《项目pub地址》https://pub.dev/packages/jstomp

之前项目上有使用到Stomp协议封装的websocket,端上使用订阅通道的形式,支持ws与http,支持订阅多个通道, JStomp是我基于当前项目中的使用和总结开发的一个FLutter 插件,一般中小型的项目中有消息推送,IM等业务场 景增加进入,下面具体看一下怎么接入。

一、提供的能力

1、支持ws方式连接

2、支持http方式连接

3、支持连接时的自定义验证参数,如token等

4、支持同时订阅多个点对点通道

5、支持同时订阅多个广播通道

6、提供连接、消息、发送等回调监听

7、支持发送消息时的自定义消息头

8、JStomp为单例设计,避免多次初始化和订阅

9、可不手动断开连接,程序重新进入重新初始化处理,不会多次订阅

10、轻量级接入,使用简单

11、自动管理心跳,无需使用者自己发送心跳维持长连接

12、支持AndroidX

13、连接失败或者断开连接后默认重试15分钟,重试间隔10秒

二、使用

1、引用

1561620483(1).jpg

当前稳定版本为1.1.0,具体版本可以不pub官网地址:https://pub.dev/packages/jstomp

2、stomp初始化,JStomp类本身是单例,

获取JStomp实例对象,或者直接使用JStomp.instance,或者JStomp()都是可以

  String userId = "1044521635390701569";
    ///初始化连接url
    String url =
        "ws://192.168.1.222:9999/message/websocket?personId=" + userId;

    ///开始初始化,参数senUrl:为发送消息的url
    bool b =
        await stomp.init(url: url, sendUrl: "/groupMessage/sendMessage");

初始化成功会返回true,失败则false,根据初始化结果做下面的几部操作

3、打开stomp连接

if (b) {
///打开stomp连接
  await stomp.connection((open) {

///连接成功打开回调
    print("连接打开了...$open");

  }, onError: (error) {

///打开错误回调
    print("连接打开错误了...$error");

  }, onClosed: (closed) {

///连接关闭时回调
    print("连接打开错误了...$closed");

  });
}

有三个回调方法,可以在对应的回调方法中处理相应的逻辑:

open:连接打开成功时回调,参数为bool类型,值为true或者false
error:打开连接错误时回调,参数为String类型,表示错误信息
closed:连接关闭时回调,参数为bool类型,值为true或者false

4、订阅消息通道,可以订阅点对点或者广播通道,都支持同时订阅多个地址

  ///点对点订阅地址
  final String p2p = "/groupMessage/" + userId;

  ///开始订阅点对点通道
  await stomp.subscribP2P([p2p]);

  ///订阅广播通道
  await stomp.subscribBroadcast(["广播通道1...", "广播通道2..."]);

5 、添加消息监听器,在消息监听器中监听消息的接收

      ///添加消息监听器
      await stomp.onMessageCallback((message) {

        ///点对点消息回调
        print("收到p2p新消息:" + message.toString());

      }, onBroadCast: (cast) {

        ///广播消息回调
        print("收到新广播消息:" + cast.toString());

      });

回调过来的参数message和cast是一个json格式的字符串,根据返回的结果进行解析即可。

6、添加消息发送监听器,发送消息结果回调

    ///添加发送消息监听器
    await stomp.onSendCallback((status, sendMsg) {

      ///消息发送结果回调,不管发送失败还是成功都会回调,
      ///参数 status:代表发送状态,是个枚举类型
      print("消息发送完毕:$status :msg=" + sendMsg.toString());

    });

同样的回调结果的sendMsg为json格式的字符串。

7、发送消息

  ///
  /// 发送消息
  ///
  Future<String> sendMsg() async {

    ///构造消息体,这里为一个Map
    Map<String, dynamic> msg = {
      "content": "flutter消息",
      "createId": "1143077861691756546",
      "createName": "牛不二",
      "createTime": "2019-06-27 17:03:51",
      "id": "1046324312976343042",
      "microGroupId": "1143049991384731649",
      "microGroupName": "flutter讨论群",
      "type": 0
    };

    ///stomp消息头,默认不需要,这里自定义一个
    Map<String, dynamic> head = {
      "userId": "p123456",
      "token": "MgjkjkdIdkkDkkjkfdjfdkjfk",
    };

    ///开始发送
    return await stomp.sendMessage(json.encode(msg), header: head);
  }

发送消息的方法为:sendMessage(),包含两个参数,第一个参数是必选参数,为消息体(json格式字串);第二个参数为可选参数,根据业务需要可以自定义stomp头,比如token,user验证等。

8、stomp断开连接,并销毁资源

  ///
  /// 断开连接,并销毁资源
  ///
  Future<bool> _destroy() async {

    if (stomp == null) {
      return true;
    }

    bool b = await stomp.destroy();
    stomp = null;
    return b;
  }

destroy方法不但会断开stomp的连接,停止stomp服务,并且会销毁stomp的客户端与相关资源,所以一般是在程序退出或者确定要销毁服务的地方调用。

《Flutter 中sqlite使用》https://blog.csdn.net/qq_19979101/article/details/93030803

《Flutter 状态管理之Redux》https://blog.csdn.net/qq_19979101/article/details/92645385

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容