默认
发表评论 14
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
[已回复] MobileIMKSD移动端给MobileIMSDK-web端群发消息写在哪里
if(ServerLauncher.bridgeEnabled && !OnlineProcessor.isOnline(pFromClient.getTo()))
                                {
                                        logger.debug("[IMCORE<C2C>-桥接↑]>> 客户端"+pFromClient.getTo()+"不在线,数据[from:"+pFromClient.getFrom()
                                                        +",fp:"+pFromClient.getFp()+"to:"+pFromClient.getTo()+",content:"+pFromClient.getDataContent()
                                                        +"] 将通过MQ直发Web服务端(彼时在线则通过web实时发送、否则通过Web端进"
                                                        +"行离线存储)【第一阶段APP+WEB跨机通信算法】!");

                                        if(pFromClient.isQoS()
                                                        && QoS4ReciveDaemonC2B.getInstance().hasRecieved(pFromClient.getFp()))
                                        {
                                                needDelegateACK = true;
                                        }
                                        else
                                        {
                                                boolean toMQ = bridgeProcessor.publish(pFromClient.toGsonString());
                                                if(toMQ)
                                                {
                                                        logger.debug("[IMCORE<C2C>-桥接↑]>> 客户端"+remoteAddress+"的数据已跨机器送出成功【OK】。(数据[from:"+pFromClient.getFrom()
                                                                        +",fp:"+pFromClient.getFp()+",to:"+pFromClient.getTo()+",content:"+pFromClient.getDataContent()
                                                                        +"]【第一阶段APP+WEB跨机通信算法】)");

                                                        if(pFromClient.isQoS())
                                                                needDelegateACK = true;
                                                }
                                                else
                                                {
                                                        logger.debug("[IMCORE<C2C>-桥接↑]>> 客户端"+remoteAddress+"的数据已跨机器送出失败,将作离线处理了【NO】。(数据[from:"+pFromClient.getFrom()
                                                                        +",fp:"+pFromClient.getFp()+"to:"+pFromClient.getTo()+",content:"+pFromClient.getDataContent()
                                                                        +"]【第一阶段APP+WEB跨机通信算法】)");

                                                        boolean offlineProcessedOK = serverCoreHandler.getServerEventListener()
                                                                        .onTransBuffer_C2C_RealTimeSendFaild_CallBack(pFromClient.getTo()
                                                                                        , pFromClient.getFrom(), pFromClient.getDataContent(), pFromClient.getFp(), pFromClient.getTypeu());
                                                        if(pFromClient.isQoS() && offlineProcessedOK)
                                                        {
                                                                needDelegateACK = true;
                                                        }
                                                        else
                                                        {
                                                                logger.warn("[IMCORE<C2C>-桥接↑]>> 客户端"+remoteAddress+"的通用数据传输消息尝试实时发送没有成功,但上层应用层没有成" +
                                                                                "功(或者完全没有)进行离线存储,此消息将被服务端丢弃【第一阶段APP+WEB跨机通信算法】!");
                                                        }
                                                }
                                        }

                                        if(needDelegateACK)
                                        {
                                                boolean receivedBackSendSucess = LocalSendHelper.replyDelegateRecievedBack(session, pFromClient);
                                                if(receivedBackSendSucess)
                                                        logger.debug("[IMCORE<C2C>-桥接↑]【QoS_伪应答_C2S】向"+pFromClient.getFrom()+"发送"+pFromClient.getFp()
                                                                        +"的伪应答包成功,伪装from自:"+pFromClient.getTo()+"【第一阶段APP+WEB跨机通信算法】.");
                                        }

                                        QoS4ReciveDaemonC2B.getInstance().addRecieved(pFromClient);
                                }
我循环的调用这一段合理吗,这样调用之后,web端的为什么只有一个人能收到呢

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

上一篇:[已解决] 为何QoS4ReciveDaemonRoot中的暂存处理线程被设定在5分钟以后运行下一篇:[已回复] 有时候在MobileIMSDK客户端发送1条Web互通消息,服务端会收到3次重传?

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

推荐方案
评论 14
你看看GlobalSendHelper这个类,它就是为了跟MobileIMSDK-Web互通准备的。
你刚才在另一个帖子里说的,每次只有一个人能收到,那肯定是哪里用的不对。
因为GlobalSendHelper里的sendS2C这个方法,就是一个一个送过去的,不可能能收到,却只有一个人。
你可以把你的代码贴上来看看。

比如,另一个项目中,要向访客(访客可能登陆在Web端)发送数据,那么调用GLoabalSendHelper.sendS2C方法就行了,这个方法会自动判断接收者
MobileIMSDK APP这边还是MobileIMSDK-Web那边,如果在MobileIMSDK-Web那边,那么这条数据会在MobileIMSDK-Web那边的桥接消息回调里收到,比如这段代码是下面这样:
        
        /**
         * 将客服分配成功分配到访客的消息以指令的方式由服务端发给访客,以便对方UI上显示提示内容。
         *
         * @param csid 为其服务的客服id
         * @param visitorUserId 要通知的访客id
         * @param serviceRecordId 本次接入对应的客服服务记录id号
         * @returns {*} true表示指令发送成功
         */
        private boolean sendGetNextVisitorResultToVisitor(String csid, String visitorUserId, String serviceRecordId)
        {
                GetNextVisitorResultToVisitor gvrv = new GetNextVisitorResultToVisitor();
                gvrv.setCsid(csid);
                gvrv.setServiceRecordId(serviceRecordId);

                // 构造要发送的Protocal:由服务端将此指令发送给对应的客服端(所以from='0'、to=csid)
                Protocal p = ProtocalFactory.createCommonData(
                                // dataContent的内容
                                g.toJson(gvrv)
                                , "0", visitorUserId, true, Protocal.genFingerPrint()
                                // 注意:跟对访客的反馈用的同一个类型id
                                , UserMessageType.TYPE_CMD_S_GET_NEXT_VISITOR_RESULT);
                
            boolean ok = false;
            try
            {
                    // 发送数据(如果接收者在本机在线列表,则发送本机列表,否则发送至桥接中间件)
                    // FIXME: 第二阶段的集群实现后,跨服消息的发送将不需要使用这种非此即彼的逻辑了
                    ok = GlobalSendHelper.sendDataS2C(
                                    ServerLauncherImpl.getInstance().getServerCoreHandler().getBridgeProcessor()
                                    , p);
            }
            catch (Exception e)
            {
                    logger.info("【IM_回调通知】 服务端向访客"+ visitorUserId +"发送\"接入下一个访客\"结果时出错了", e);
            }
引用:JackJiang 发表于 2018-03-29 10:57
你刚才在另一个帖子里说的,每次只有一个人能收到,那肯定是哪里用的不对。
因为GlobalSendHelper里的send ...

我是在sendDataC2C这里去循环发的,不知道问题出现在哪里了

QQ截图20180329110157.png (63.7 KB, 下载次数: 2584)

QQ截图20180329110157.png

QQ截图20180329110223.png (48.95 KB, 下载次数: 2769)

QQ截图20180329110223.png

微信截图_20180329110305.png (72.03 KB, 下载次数: 2598)

微信截图_20180329110305.png
引用:401523591 发表于 2018-03-29 11:04
我是在sendDataC2C这里去循环发的,不知道问题出现在哪里了

你的方法调用错了,你看看MobileIMSDK的API文档的说明,并再回头看看我贴在3楼的代码样例(仅供参考):
[已回复] MobileIMKSD移动端给MobileIMSDK-web端群发消息写在哪里_WX20180329-110706@2x.png
web客户端怎么给移动端和web端的群发消息
引用:401523591 发表于 2018-03-29 11:52
web客户端怎么给移动端和web端的群发消息

MobileIMSDK-Web端那边,同样有函数,你看看下下面这个例子(跟3楼的是同样的逻辑,只是这里是Web端的实现):
/**
 * 将客服分配成功分配到访客的消息以指令的方式由服务端发给访客,以便对方UI上显示提示内容。
 *
 * @param csid 为其服务的客服id
 * @param visitorUserId 要通知的访客id
 * @param serviceRecordId 本次接入对应的客服服务记录id号
 * @returns {*} true表示指令发送成功
 */
function sendGetNextVisitorResultToVisitor(csid, visitorUserId, serviceRecordId, switchedFrom){

    var data = {};
    data.csid = csid;
    data.serviceRecordId = serviceRecordId;
    data.switchfrom = (switchedFrom==null)?"":switchedFrom;

    // 由服务端将此指令发送给对应的客服端(所以from='0'、to=csid)
    var p = ProtocalFactory.createCommonDataU(
        JSON.stringify(data),
        '0', visitorUserId,
        MsgType.S_USER_CMD_TYPE_GET_NEXT_VISITOR_RESULT // 注意:跟对访客的反馈用的同一个类型id
    );

    // 由服务端将此指令发送给对应的客服端(所以from='0'、to=csid)
    var ok = imServerSDK.publicSendDataGlobal(
        null
        , p
        , null // null表示使用默认的离线消息处理:按普通聊天消息的处理逻辑进行可能的
               // 离线处理(即接收方如果在线没有收到,下次上线可以作为离线消息给拉过去)
    );

    return ok;
}
ok,了解了,谢谢
引用:JackJiang 发表于 2018-03-29 12:11
MobileIMSDK-Web端那边,同样有函数,你看看下下面这个例子(跟3楼的是同样的逻辑,只是这里是Web端的实 ...

ok,了解了,谢谢
引用:JackJiang 发表于 2018-03-29 11:08
你的方法调用错了,你看看MobileIMSDK的API文档的说明,并再回头看看我贴在3楼的代码样例(仅供参考):
...

我现在调用了s2c的方式,在web端会收到多条消息,并且是隔一小会之后又收到一条,是什么情况呢
引用:401523591 发表于 2018-03-30 11:48
我现在调用了s2c的方式,在web端会收到多条消息,并且是隔一小会之后又收到一条,是什么情况呢

你可以仔细看看方法的说明,写的很详细。
你处理完MQ消息的返回值,决定了MQ中会不会把这条消息给去掉。。
引用:401523591 发表于 2018-03-29 11:04
我是在sendDataC2C这里去循环发的,不知道问题出现在哪里了

ServerLauncherImpl.getInstance().getServerCoreHandler().getBridgeProcessor();这个方法是没有的,需要自己去写吗
有个问题,web端的用户在发送消息时,总是提示掉线了,是什么原因造成的呢
引用:JackJiang 发表于 2018-03-29 12:11
MobileIMSDK-Web端那边,同样有函数,你看看下下面这个例子(跟3楼的是同样的逻辑,只是这里是Web端的实 ...

有个问题,web端的用户在发送消息时,总是提示掉线了,是什么原因造成的呢
引用:401523591 发表于 2018-04-08 20:20
有个问题,web端的用户在发送消息时,总是提示掉线了,是什么原因造成的呢

你单开一贴,把web那边的log抓的全面一点,别贴个牛皮癣一小块,没办法看全。
其它客户用起来很稳定,不会发生提示掉线的问题,估计又是搞出什么问题了。
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部