C# Mqtt 断线重连
在通过 MqttClient 客户端连接之后,在服务端服务重启时,客户端如果没有重连机制,则无法再接收到订阅的消息。
使用的 Mqtt 组件为:M2Mqtt.Net.dll
一些特性发现
(1)如果提供的服务端地址是不可解析的,会引发异常无法实例化 MqttClient 对象。
(2)Connect 无法连接时会引发异常,IsConnected 为 false。
(3)服务端断开会触发客户端的 ConnectionClosed 事件,IsConnected 为 false。
(4)重新 Connect 需要重新 Subscribe 订阅主题。
(5)MqttClient.Subscribe 第一个参数为订阅主题数组,第二个为相应的 qosLevel,两个数组长度必须一致,否则会异常。
重连流程控制

主要代码实现
(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", "topic2" },
new byte[] { MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE, MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE });
}
}
实测效果不错,其中延时时间可以适当调整。
C# Mqtt 断线重连的更多相关文章
- android 实现mqtt消息推送,以及不停断线重连的问题解决
前段时间项目用到mqtt的消息推送,整理一下代码,代码的原型是网上找的,具体哪个地址已经忘记了. 代码的实现是新建了一个MyMqttService,全部功能都在里面实现,包括连服务器,断线重连,订阅消 ...
- 关于socket tcp 断线重连
这个问题困扰过我几次,都没有来得及研究,今天研究一下. 首先写一个最简易的socket tcp程序,连接成功后再关闭服务器然后再用客户端各种操作看是什么情况 测试表明 (1)客户端已经连接,当服务端关 ...
- netty4 断线重连
转载:http://www.tuicool.com/articles/B7RzMbY 一 实现心跳检测 原理:当服务端每隔一段时间就会向客户端发送心跳包,客户端收到心跳包后同样也会回一个心跳包给服务端 ...
- Netty 客户端断线重连
client 关闭后会执行 finally 代码块,可以在这里可以进行重连操作 public class NettyClient implements Runnable { private final ...
- ActiveMQ的断线重连机制
断线重连机制是ActiveMQ的高可用性具体体现之一.ActiveMQ提供failover机制去实现断线重连的高可用性,可以使得连接断开之后,不断的重试连接到一个或多个brokerURL. 默认情况下 ...
- ADOConnection断线重连
问题: ADOConnection断线重连问题描述: 使用ADOConnection连接oracle数据库,开始正常,当网络断开时数据库连接失败(此时查询ADOConnection.connected ...
- 发现电脑上装着liteide,就用golang做一个TCP通讯测试(支持先启动client端和断线重连)
1.参考https://www.cnblogs.com/yin5th/p/9274495.html server端 main.go package main import ( "fmt&qu ...
- Netty断线重连
Netty断线重连 最近使用Netty开发一个中转服务,需要一直保持与Server端的连接,网络中断后需要可以自动重连,查询官网资料,实现方案很简单,核心思想是在channelUnregistered ...
- 浅谈IM软件client的断线重连、心跳和长在线
版权声明:原创文章,未经博主同意禁止转载.欢迎点击头像上方"郭晓东的专栏"查看专栏 https://blog.csdn.net/hherima/article/details/27 ...
随机推荐
- TP框架基础(四)----添加数据
[数据添加] add() 该方法返回被添加的新记录的主键id值 两种方式实现数据添加 1. 数组方式数据添加 $goods = D(“Goods”); $arr = array(‘goods_name ...
- python课堂整理15---map, filter,reduce函数
一.map函数 处理序列(可迭代对象)中的每一个元素,得到的结果是一个‘列表’(其实是个迭代器),该‘列表’元素个数及位置与原来一样 理解下面这段代码: num_l = [1, 2, 4, 6] de ...
- linux初学者-常用基本命令篇
linux系统中有着许许多多的命令,并且软件也有可能自带命令,要想全部了解这些命令是很困难的,但是有一些基本命令是在平时的学习工作中应用的很广泛的.以下简要介绍几种linux系统中的常用命令. 1.m ...
- python带有GIL解释器锁
1.GIL是什么?GIL的全称是Global Interpreter Lock(全局解释器锁),来源是python设计之初的考虑,为了数据安全所做的决定. 2.每个CPU在同一时间只能执行一个线程(在 ...
- 初始Spring 文档 完整版
初始Spring 1.Spring官网 spring.io 01. IOC(Inverse of Control)控制反转 02. AOP(Aspect Oritend Programming)面向切 ...
- JSP第一章动态网页的基础
什么是动态网站(dynamic website)? 动态网站: 误区:初学者一般认为动态网页,就是会动的网页,但实际上不是这样的. 动态网页是指在服务器端运行的,使用程序语言设计的交互式网页,它们会根 ...
- 金蝶K3 V12.2版本,对已发生业务单据的物料启用辅助计量单位
/****************************************************************************** 联达双计量单位 yLD_K3Data_S ...
- JS面向对象编程(二):构造函数的继承
对象之间继承的 5 中方法. 比如, 现在有一个"动物"对象的构造函数. function Animal(){ ...
- 这 3 个 Set 集合的实现有点简单,那来做个总结吧
Set 接口是 Java Collections Framework 中的一员,它的特点是:不能包含重复的元素,允许且最多只有一个 null 元素.Java 中有三个常用的 Set 实现类: Hash ...
- Mac相关快捷键操作
拷贝: shift + option + 拖动拖动至目的地 创建快捷方式: option + command + 拖动至目的地