语言同步断网重连机制 mqtt_C# Mqtt 断线重连

在通过 MqttClient 客户端连接之后,在服务端服务重启时,客户端如果没有重连机制,则无法再接收到订阅的消息。

使用的 Mqtt 组件为:M2Mqtt.Net.dll

一些特性发现

(1)如果提供的服务端地址是不可解析的,会引发异常无法实例化 MqttClient 对象。

(2)Connect 无法连接时会引发异常,IsConnected 为 false。

(3)服务端断开会触发客户端的 ConnectionClosed 事件,IsConnected 为 false。

(4)重新 Connect 需要重新 Subscribe 订阅主题。

(5)MqttClient.Subscribe 第一个参数为订阅主题数组,第二个为相应的 qosLevel,两个数组长度必须一致,否则会异常。

重连流程控制

97218fdd7e77ebc0f9756a7c8888a491.png

自动重连.png

主要代码实现

(1)线程主体

// 自动重连主体private void _TryContinueConnect(){ if (IsConnected) return; Thread retryThread = new Thread(new ThreadStart(delegate { while (_MqttClient == null || !_MqttClient.IsConnected) { if (_ToClose) break; if (_MqttClient == null) { _BuildClient(); Thread.Sleep(3000); continue; } try { _TryCount++; _Connect();  } catch (Exception ce) { Debug.WriteLine("re connect exception:" + ce.Message); } // 如果还没连接不符合结束条件则睡2秒 if (!_MqttClient.IsConnected) { Thread.Sleep(2000); } } }));  retryThread.Start();}

(2)实例化部分

// 实例化客户端private void _BuildClient(){ try { _MqttClient = new MqttClient(_MqttServer); } catch (Exception e) { Debug.WriteLine("build client error:" + e.Message); return; } // 消息到达事件绑定 _MqttClient.MqttMsgPublishReceived += client_MqttMsgPublishReceived; // 连接断开事件绑定 _MqttClient.ConnectionClosed += (sender, e) => { if (!_ToClose) { // 尝试重连 _TryContinueConnect(); } };}

(3)尝试连接部分

// 发起一次连接,连接成功则订阅相关主题 private void _Connect(){ if (String.IsNullOrEmpty(_MqttUsername)) { var b = _MqttClient.Connect(_MqttClientId); } else { var b = _MqttClient.Connect(_MqttClientId, _MqttUsername, _MqttUserpass); }  if (_MqttClient.IsConnected) { _MqttClient.Subscribe(new string[] { "topic1
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值