C# Mqtt 斷線重連的實(shí)現(xiàn)代碼
在通過 MqttClient 客戶端連接之后,在服務(wù)端服務(wù)重啟時,客戶端如果沒有重連機(jī)制,則無法再接收到訂閱的消息。
使用的 Mqtt 組件為:M2Mqtt.Net.dll
一些特性發(fā)現(xiàn)
(1)如果提供的服務(wù)端地址是不可解析的,會引發(fā)異常無法實(shí)例化 MqttClient 對象。
(2)Connect 無法連接時會引發(fā)異常,IsConnected 為 false。
(3)服務(wù)端斷開會觸發(fā)客戶端的 ConnectionClosed 事件,IsConnected 為 false。
(4)重新 Connect 需要重新 Subscribe 訂閱主題。
(5)MqttClient.Subscribe 第一個參數(shù)為訂閱主題數(shù)組,第二個為相應(yīng)的 qosLevel,兩個數(shù)組長度必須一致,否則會異常。
重連流程控制

主要代碼實(shí)現(xiàn)
(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);
}
// 如果還沒連接不符合結(jié)束條件則睡2秒
if (!_MqttClient.IsConnected)
{
Thread.Sleep(2000);
}
}
}));
retryThread.Start();
}
(2)實(shí)例化部分
// 實(shí)例化客戶端
private void _BuildClient()
{
try
{
_MqttClient = new MqttClient(_MqttServer);
}
catch (Exception e)
{
Debug.WriteLine("build client error:" + e.Message);
return;
}
// 消息到達(dá)事件綁定
_MqttClient.MqttMsgPublishReceived += client_MqttMsgPublishReceived;
// 連接斷開事件綁定
_MqttClient.ConnectionClosed += (sender, e) =>
{
if (!_ToClose)
{
// 嘗試重連
_TryContinueConnect();
}
};
}
(3)嘗試連接部分
// 發(fā)起一次連接,連接成功則訂閱相關(guān)主題
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 });
}
}
實(shí)測效果不錯,其中延時時間可以適當(dāng)調(diào)整。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
c# 從內(nèi)存中釋放Selenium chromedriver.exe
這篇文章主要介紹了c# 從內(nèi)存中釋放Selenium chromedriver.exe的方法,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2021-01-01
C#調(diào)用Java類的實(shí)現(xiàn)方法
以下是對使用C#調(diào)用Java類的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下2013-09-09
c#和avascript加解密之間的互轉(zhuǎn)代碼分享
這篇文章主要介紹了c#和Javascript間互轉(zhuǎn)的Xxtea加解密代碼,需要的朋友可以參考下2014-02-02
C#彈出對話框確定或者取消執(zhí)行相應(yīng)操作的實(shí)例代碼
這篇文章主要介紹了C#彈出對話框確定或者取消執(zhí)行相應(yīng)操作的實(shí)例代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12

