第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Golang-Paho MQTT 訂閱者在重新初始化訂閱者后不斷斷開(kāi)連接并出現(xiàn)錯(cuò)誤 EOF

Golang-Paho MQTT 訂閱者在重新初始化訂閱者后不斷斷開(kāi)連接并出現(xiàn)錯(cuò)誤 EOF

Go
肥皂起泡泡 2022-10-10 18:11:18
我正在嘗試動(dòng)態(tài)更改 mqtt 客戶端處理程序和證書(shū),當(dāng)訂閱者和發(fā)布者連接時(shí),這會(huì)導(dǎo)致訂閱者 EOF這就是我正在嘗試做的,1] 我正在初始化訂閱者/發(fā)布者(使用 firstPubHandler、firstConnectHandler 和默認(rèn)證書(shū))2] 使用發(fā)布者在服務(wù)器上發(fā)送注冊(cè)消息以獲取新證書(shū)詳細(xì)信息3] 服務(wù)器將返回證書(shū)詳細(xì)信息,該響應(yīng)將由 firstConnectHandler 在主題.../id/Certificate上處理以下載證書(shū)。4] firstPubHandler 將處理服務(wù)器的響應(yīng)并重新初始化發(fā)布者/訂閱者(使用 messagePubHandler、connectHandler 和新下載的證書(shū)),connectHandler 將偵聽(tīng)所有主題/id/+一切正常,除了當(dāng)我重新初始化訂閱者/發(fā)布者時(shí),訂閱者不斷斷開(kāi)連接并出現(xiàn)錯(cuò)誤“EOF”我在這里做錯(cuò)什么了嗎?或者有沒(méi)有更好的方法來(lái)做到這一點(diǎn)?任何幫助表示贊賞- 主功能var opt Paramsvar publisher mqtt.Clientvar subscriber mqtt.Clientfunc main() {    InitializeBroker(firstPubHandler, firstConnectHandler)    //Ultimately it will trigger message on ".../id/Certificate" topic which will be handled byfirstConnectHandler     PublishRegistrationMessage(publisher)    c := make(chan os.Signal, 1)    signal.Notify(c, os.Interrupt, syscall.SIGTERM)    done := make(chan os.Signal, 1)    signal.Notify(done, os.Interrupt, syscall.SIGTERM)    go func() {        for {        }    }()    <-done    <-c    DisconnectBrocker()}-- 處理程序// First handlersvar firstPubHandler mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) {    DownloadCertificates(msg.Payload())    InitializeBroker(messagePubHandler, connectHandler)}var firstConnectHandler mqtt.OnConnectHandler = func(c mqtt.Client) {    if token := c.Subscribe(opt.SubClientId+"/id/Certificate", 0, firstPubHandler); token.Wait() && token.Error() != nil {        log.Error(token.Error())    }}// Second handlersvar messagePubHandler mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) {    ProcessMessage(msg.Payload())}var connectHandler mqtt.OnConnectHandler = func(c mqtt.Client) {    if token := c.Subscribe(opt.SubClientId+"/id/+", 0, messagePubHandler); token.Wait() && token.Error() != nil {        log.Error(token.Error())    }}// Common handlervar connectLostHandler mqtt.ConnectionLostHandler = func(client mqtt.Client, err error) {    log.Info(err)}
查看完整描述

1 回答

?
搖曳的薔薇

TA貢獻(xiàn)1793條經(jīng)驗(yàn) 獲得超6個(gè)贊

基于對(duì)您的代碼的快速審查,這就是我認(rèn)為正在發(fā)生的事情(因?yàn)槟鷽](méi)有提供所有代碼,所以涉及一些猜測(cè)):

  1. main()調(diào)用InitializeBroker創(chuàng)建兩個(gè)到代理的連接。默認(rèn)發(fā)布處理程序設(shè)置為firstPubHandler并在OnConnect您訂閱的處理程序中SubClientId+"/id/Certificate

  2. 當(dāng)接收到消息 ( ) 時(shí),您從消息中獲取證書(shū)并使用它與使用相同客戶端 ID 但不同/default 發(fā)布處理程序firstPubHandler的代理建立一組新連接。OnConnect

因此,在第 2 點(diǎn)之后,您實(shí)際上有兩組獨(dú)立的代理連接(總共 4 個(gè)連接)。但是MQTT-3.1.4-2(參見(jiàn)規(guī)范)指出:

如果 ClientId 代表一個(gè)已經(jīng)連接到服務(wù)器的客戶端,那么服務(wù)器必須斷開(kāi)現(xiàn)有的客戶端。

因此,當(dāng)建立第二組連接時(shí),代理將丟棄第一組連接。這是您看到的“EOF”斷開(kāi)連接。第二組連接仍將啟動(dòng)。當(dāng)您connectLostHandler對(duì)第一組和第二組連接使用相同的連接時(shí),您無(wú)法在日志中看到哪個(gè)連接被終止。

總之,我相信您的代碼確實(shí)有效。但是,您可能應(yīng)該調(diào)用c.Disconnect()firstConnectHandler以便在建立第二組連接之前完全關(guān)閉初始連接。您還需要將其存儲(chǔ)在publisher某處,以便同時(shí)斷開(kāi)該連接。

注意:我很難理解你為什么要這樣做。建立初始連接以檢索證書(shū)似乎會(huì)降低系統(tǒng)的整體安全性。標(biāo)準(zhǔn)方法是給每個(gè)客戶端一個(gè)唯一的證書(shū),然后使用代理上的 ACL 來(lái)應(yīng)用任何必要的限制。對(duì)于許多代理,您可以在 ACL 中使用證書(shū)公用名(從而消除對(duì)第二個(gè)連接的需要)。


查看完整回答
反對(duì) 回復(fù) 2022-10-10
  • 1 回答
  • 0 關(guān)注
  • 1031 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)