欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網(wǎng)!

C#教程

當(dāng)前位置:主頁 > 軟件編程 > C#教程 >

C# Mqtt 斷線重連的實現(xiàn)代碼

來源:本站原創(chuàng)|時間:2020-01-10|欄目:C#教程|點擊: 次

在通過 MqttClient 客戶端連接之后,在服務(wù)端服務(wù)重啟時,客戶端如果沒有重連機(jī)制,則無法再接收到訂閱的消息。

使用的 Mqtt 組件為:M2Mqtt.Net.dll

一些特性發(fā)現(xiàn)

(1)如果提供的服務(wù)端地址是不可解析的,會引發(fā)異常無法實例化 MqttClient 對象。
(2)Connect 無法連接時會引發(fā)異常,IsConnected 為 false。
(3)服務(wù)端斷開會觸發(fā)客戶端的 ConnectionClosed 事件,IsConnected 為 false。
(4)重新 Connect 需要重新 Subscribe 訂閱主題。
(5)MqttClient.Subscribe 第一個參數(shù)為訂閱主題數(shù)組,第二個為相應(yīng)的 qosLevel,兩個數(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)實例化部分

// 實例化客戶端
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 });
  }
}

實測效果不錯,其中延時時間可以適當(dāng)調(diào)整。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。

上一篇:C#客戶端程序Visual Studio遠(yuǎn)程調(diào)試的方法詳解

欄    目:C#教程

下一篇:C#托管內(nèi)存與非托管內(nèi)存之間的轉(zhuǎn)換的實例講解

本文標(biāo)題:C# Mqtt 斷線重連的實現(xiàn)代碼

本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/4658.html

您可能感興趣的文章

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

如果侵犯了您的權(quán)利,請與我們聯(lián)系,我們將在24小時內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有