当前位置:   article > 正文

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

flutter websocket stomp

《项目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、引入

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

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

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

JStomp stomp=JStomp.instance;

  1. String userId = "1044521635390701569";
  2. ///初始化连接url
  3. String url ="ws://192.168.1.1:9999/message/websocket?userId=" + userId;
  4. ///开始初始化,参数senUrl:为发送消息的url
  5. bool b =await stomp.init(url: url, sendUrl: "/groupMessage/sendMessage");

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

3、打开stomp连接

  1. if (b) {
  2. ///打开stomp连接
  3. await stomp.connection((open) {
  4. ///连接成功打开回调
  5. print("连接打开了...$open");
  6. }, onError: (error) {
  7. ///打开错误回调
  8. print("连接打开错误了...$error");
  9. }, onClosed: (closed) {
  10. ///连接关闭时回调
  11. print("连接打开错误了...$closed");
  12. });
  13. }

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

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

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

  1. ///点对点订阅地址
  2. final String p2p = "/groupMessage/" + userId;
  3. ///开始订阅点对点通道
  4. await stomp.subscribP2P([p2p]);
  5. ///订阅广播通道
  6. await stomp.subscribBroadcast(["广播通道1...", "广播通道2..."]);

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

  1. ///添加消息监听器
  2. await stomp.onMessageCallback((message) {
  3. ///点对点消息回调
  4. print("收到p2p新消息:" + message.toString());
  5. }, onBroadCast: (cast) {
  6. ///广播消息回调
  7. print("收到新广播消息:" + cast.toString());
  8. });

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

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

  1. ///添加发送消息监听器
  2. await stomp.onSendCallback((status, sendMsg) {
  3. ///消息发送结果回调,不管发送失败还是成功都会回调,
  4. ///参数 status:代表发送状态,是个枚举类型
  5. print("消息发送完毕:$status :msg=" + sendMsg.toString());
  6. });

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

7、发送消息

  1. ///
  2. /// 发送消息
  3. ///
  4. Future<String> sendMsg() async {
  5. ///构造消息体,这里为一个Map
  6. Map<String, dynamic> msg = {
  7. "content": "flutter消息",
  8. "createId": "1143077861691756546",
  9. "createName": "牛不二",
  10. "createTime": "2019-06-27 17:03:51",
  11. "id": "1046324312976343042",
  12. "microGroupId": "1143049991384731649",
  13. "microGroupName": "flutter讨论群",
  14. "type": 0
  15. };
  16. ///stomp消息头,默认不需要,这里自定义一个
  17. Map<String, dynamic> head = {
  18. "userId": "p123456",
  19. "token": "MgjkjkdIdkkDkkjkfdjfdkjfk",
  20. };
  21. ///开始发送
  22. return await stomp.sendMessage(json.encode(msg), header: head);
  23. }

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

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

  1. ///
  2. /// 断开连接,并销毁资源
  3. ///
  4. Future<bool> _destroy() async {
  5. if (stomp == null) {
  6. return true;
  7. }
  8. bool b = await stomp.destroy();
  9. stomp = null;
  10. return b;
  11. }

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

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/268663
推荐阅读
相关标签
  

闽ICP备14008679号