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 ...
随机推荐
- Windows 设置自启动计划任务(非登录启动)
原因:服务器会不定期重启,且重启后无人看管,不会有人去登录系统.导致我们做的一些开机启动程序失效,进而系统瘫痪. 解决方法: 自己理解,想要达到目的有两种方式:系统服务 & 计划任务配置. 计 ...
- .NET Core CSharp初级篇 1-6 类的多态与继承
.NET Core CSharp初级篇 1-6 本节内容为类的多态与继承 简介 终于讲到了面向对象三大特性中的两大特性--继承与多态.通过继承与多态,我们能很好的将类的拓展性发挥到了极致.在下面的内容 ...
- org.mybatis.spring.MyBatisSystemException异常及处理
org.mybatis.spring.MyBatisSystemException异常处理 测试场景 在测试springboot中使用MyBatis/通用Mapper的自定义方法时出现此异常. 异常如 ...
- Java EE产生的背景
为了满足开发多层体系结构的企业级应用的需求,Java公司的创始人Sun公司在早期的J2SE(Java 2 Platform Standard Edition)基础上,针对企业级应用的各种需求,提出了J ...
- linux初学者-DNS配置篇
linux初学者-DNS配置篇 DNS在之前的网络管理篇已经做过介绍,下文将叙述DNS在学习工作中的一些配置以及应用. 1.高速缓存DNS 一台主机通过DNS服务器询问域名解析IP是需要一定的时间的, ...
- JS制作简易的考试答题管理系统
答题卡系统: 网站运行效果 代码区域: HTML 代码: <style type="text/css"> body { font-size: 30px; backgro ...
- 箭头函数=>
箭头函数特点一:没有自己的this对象,其this对象为所在环境 特点二 :没有arguments参数 可以用...rest代替特点三:不能使用构造函数,不可使用new命令,否则会报错 //函数的扩展 ...
- __int64与long long、long的区别
首先来看一看int.long.long long的取值范围 int 所占字节数为:4 表示范围为:-2147483648~2147 ...
- 关于python中的特殊方法
研究了几个小时,大概对python中的特殊方法一知半解,现在写写自己的理解,以及记录一些找到的资源.待自己有比较深入理解的时候,再来更新 https://docs.python.org/3/refer ...
- 重启iis的命令是什么?三种简单的重启方式
第一种.界面操作 打开“控制面板”->“管理工具”->“服务”.找到“IIS Admin Service” 右键点击“重新启动” 弹出 “停止其它服务” 窗口,点击“是”. 第二种.Net ...