默认
发表评论 8
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
[已回复] 求教MobileIMSDK的聊天消息应答ack逻辑的疑问?
我看到在QOS机制下,服务端给客户端发送一条QOS=true消息,客户端收到消息后会发送一个QOS=false应答包。服务端接收到这个ack后会再发送一个QOS=false的应答包。  不太理解 ,最后一个应答包的意义何在,为什么对客户端的ack还要在发送一个ack?

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

标签:MobileIMSDK
上一篇:[已回复] MobileIMSDK的android端当手机黑屏后,再次唤醒手机的异常信息解读下一篇:[已解决] 求助MobileIMSDK聊天登录失败,错误代码:1026

本帖已收录至以下技术专辑

推荐方案
评论 8
服务端永久只是个中转站,不存在收到后又发一个ack,只是帮客户中转发送过去而已
引用: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的意义是什么呢?

你干脆贴代码吧,这样说的清楚一点,我也能看到你到底理解的是什么
引用: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?
引用:JackJiang 发表于 2019-06-12 20:01
这代码的意思,就是帮客户端将ACK转发到目的地,不然怎么过去?P2P?

谢谢  经过一晚上,我终于想明白了。接收方将收到消息的ack给服务端,服务端会告诉发送方一个ack,通知消息已经到达。
签名: 哈哈哈
引用:后来_lG8o1 发表于 2019-06-13 09:39
谢谢  经过一晚上,我终于想明白了。接收方将收到消息的ack给服务端,服务端会告诉发送方一个ack,通知 ...

你的理解,好像还是有点不太对。。。
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部