默认
发表评论 14
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
你看看GlobalSendHelper这个类,它就是为了跟MobileIMSDK-Web互通准备的。
签名: 《B站千万级长连接实时消息系统的架构设计与实践》http://www.52im.net/thread-4647-1-1.html
评论 14
你刚才在另一个帖子里说的,每次只有一个人能收到,那肯定是哪里用的不对。
因为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);
            }
签名: 《B站千万级长连接实时消息系统的架构设计与实践》http://www.52im.net/thread-4647-1-1.html
引用:401523591 发表于 2018-03-29 11:04
我是在sendDataC2C这里去循环发的,不知道问题出现在哪里了

你的方法调用错了,你看看MobileIMSDK的API文档的说明,并再回头看看我贴在3楼的代码样例(仅供参考):
[已回复] MobileIMKSD移动端给MobileIMSDK-web端群发消息写在哪里_WX20180329-110706@2x.png
签名: 《B站千万级长连接实时消息系统的架构设计与实践》http://www.52im.net/thread-4647-1-1.html
引用: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;
}
签名: 《B站千万级长连接实时消息系统的架构设计与实践》http://www.52im.net/thread-4647-1-1.html
引用:401523591 发表于 2018-03-30 11:48
我现在调用了s2c的方式,在web端会收到多条消息,并且是隔一小会之后又收到一条,是什么情况呢

你可以仔细看看方法的说明,写的很详细。
你处理完MQ消息的返回值,决定了MQ中会不会把这条消息给去掉。。
签名: 《B站千万级长连接实时消息系统的架构设计与实践》http://www.52im.net/thread-4647-1-1.html
引用:401523591 发表于 2018-04-08 20:20
有个问题,web端的用户在发送消息时,总是提示掉线了,是什么原因造成的呢

你单开一贴,把web那边的log抓的全面一点,别贴个牛皮癣一小块,没办法看全。
其它客户用起来很稳定,不会发生提示掉线的问题,估计又是搞出什么问题了。
签名: 《B站千万级长连接实时消息系统的架构设计与实践》http://www.52im.net/thread-4647-1-1.html
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部