默認
發表評論 8
[已回復] 求教MobileIMSDK的聊天消息應答ack邏輯的疑問?
閱讀(580) | 評論(8 收藏 淘帖1
我看到在QOS機制下,服務端給客戶端發送一條QOS=true消息,客戶端收到消息后會發送一個QOS=false應答包。服務端接收到這個ack后會再發送一個QOS=false的應答包。  不太理解 ,最后一個應答包的意義何在,為什么對客戶端的ack還要在發送一個ack?

即時通訊網 - 即時通訊開發者社區! 來源: - 即時通訊開發者社區!

標簽:MobileIMSDK
上一篇:[已回復] MobileIMSDK的android端當手機黑屏后,再次喚醒手機的異常信息解讀下一篇:[已解決] 求助MobileIMSDK聊天登錄失敗,錯誤代碼:1026

本帖已收錄至以下技術專輯

推薦方案
評論 8
服務端永久只是個中轉站,不存在收到后又發一個ack,只是幫客戶中轉發送過去而已
簽名: 《對比主流分布式MQ消息隊列,媽媽再也不擔心我的技術選型了》http://www.uktmgv.tw/thread-2625-1-1.html
引用:JackJiang 發表于 2019-06-12 16:32
服務端永久只是個中轉站,不存在收到后又發一個ack,只是幫客戶中轉發送過去而已

那客戶端收到對方的ack后,在發送一個ack。是為什么? 就是type=4的情況,服務端收到后,會代替客戶端在發送給一個type=4的ack。
簽名: 初次來到
引用:JackJiang 發表于 2019-06-12 16:32
服務端永久只是個中轉站,不存在收到后又發一個ack,只是幫客戶中轉發送過去而已

我看源碼里面服務端收到type=4的ack包后,會再次發送一個type=4的ack。 最后一個ack的意義是什么呢?
簽名: 初次來到
引用:后來_lG8o1 發表于 2019-06-12 16:57
我看源碼里面服務端收到type=4的ack包后,會再次發送一個type=4的ack。 最后一個ack的意義是什么呢?

你干脆貼代碼吧,這樣說的清楚一點,我也能看到你到底理解的是什么
簽名: 《對比主流分布式MQ消息隊列,媽媽再也不擔心我的技術選型了》http://www.uktmgv.tw/thread-2625-1-1.html
引用:JackJiang 發表于 2019-06-12 18:22
你干脆貼代碼吧,這樣說的清楚一點,我也能看到你到底理解的是什么

/**
         * 處理來自客戶端的各類ACK消息應答包。
         *
         * @param pFromClient
         * @param remoteAddress
         * @throws Exception
         */
        public void processACK(final Protocal pFromClient, final String remoteAddress) throws Exception
        {
                // 【C2S數據】客戶端發給服務端的ACK應答包(即S2C模式下的應答)
                if("0".equals(pFromClient.getTo()))
                {
                        // 應答包的消息內容即為之前收到包的指紋id
                        String theFingerPrint = pFromClient.getDataContent();
                        logger.debug("[IMCORE-本機QoS!]【QoS機制_S2C】收到接收者"+pFromClient.getFrom()+"回過來的指紋為"+theFingerPrint+"的應答包.");

                        // 將收到的應答事件通知事件處理者
                        if(this.serverCoreHandler.getServerMessageQoSEventListener() != null)
                                this.serverCoreHandler.getServerMessageQoSEventListener()
                                        .messagesBeReceived(theFingerPrint);

                }
                // 【C2C數據】客戶端發給客戶端的ACK應答
                else
                {

                        // 應答包的消息內容即為之前收到包的指紋id
                        final String theFingerPrint = pFromClient.getDataContent();

                                // Netty的數據發送結果觀察者:netty的數據發送結果是通過異步通知來實現的(這就
                                // 是異步編程模型,跟Nodejs的promise、Androi里的RxJava、iOS的block道理一樣)
                                MBObserver sendResultObserver = new MBObserver(){
                                        @Override
                                        public void update(boolean _sendOK, Object extraObj)
                                        {
                                                logger.debug("[IMCORE-本機QoS!]【QoS機制_C2C】"+pFromClient.getFrom()+"發給"+pFromClient.getTo()
                                                                +"的指紋為"+theFingerPrint+"的應答包已成功轉發?"+_sendOK);
                                        }
                                };
                               
                                // 發送應答包(給消息接收者)
                                LocalSendHelper.sendData(pFromClient, sendResultObserver);
                }
        }

處理客戶端的應答包的時候,最后一行會再次發送一個應答包,是為什么呢?
       
簽名: 初次來到
引用:后來_lG8o1 發表于 2019-06-12 19:36
/**
         * 處理來自客戶端的各類ACK消息應答包。
         *

這代碼的意思,就是幫客戶端將ACK轉發到目的地,不然怎么過去?P2P?
簽名: 《對比主流分布式MQ消息隊列,媽媽再也不擔心我的技術選型了》http://www.uktmgv.tw/thread-2625-1-1.html
引用:JackJiang 發表于 2019-06-12 20:01
這代碼的意思,就是幫客戶端將ACK轉發到目的地,不然怎么過去?P2P?

謝謝  經過一晚上,我終于想明白了。接收方將收到消息的ack給服務端,服務端會告訴發送方一個ack,通知消息已經到達。
簽名: 初次來到
引用:后來_lG8o1 發表于 2019-06-13 09:39
謝謝  經過一晚上,我終于想明白了。接收方將收到消息的ack給服務端,服務端會告訴發送方一個ack,通知 ...

你的理解,好像還是有點不太對。。。
簽名: 《對比主流分布式MQ消息隊列,媽媽再也不擔心我的技術選型了》http://www.uktmgv.tw/thread-2625-1-1.html
打賞樓主 ×
使用微信打賞! 使用支付寶打賞!

返回頂部
曾氏料二肖中特