默认
发表评论 14
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
[已回复] MobileIMSDK sendDataS2C发送消息,客户端收不到?以下用法对吗?
                                        Presence presence = new Presence();
                                        presence.setId(UUID.randomUUID().toString());
                                        presence.setType("subscribe");
                                        String jsonPresence = new Gson().toJson(presence);
                                        Protocal protocal = new Protocal(0, jsonPresence, toUserId, from_user_id,   //原来的from变为to
                                                        ProtocalTypeu.ADD$FRIEND.FROM_SERVER_TYPEU_OF_SUBSCRIBE$ADD$FRIEND);
                                       
                                        //发送信息告诉toJid有人想加为好友
                                        try {
                                                GlobalSendHelper.sendDataS2C(null, protocal, null);
                                        } catch (Exception e) {
                                                e.printStackTrace();
                                        }




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

标签:MobileIMSDK
上一篇:[已回复] MobileIMSDK的 ios端因固定端口导致登录失败,报:skt==null || d == null下一篇:[已回复] MobileIMSDK在小米6上一键清除内存后,再次登录成功又被踢下线
推荐方案
评论 14
你这应该是不需要支持跨Web通信的情况,直接用LocalSendHelper,就像下面这样: [已回复] MobileIMSDK sendDataS2C发送消息,客户端收不到?以下用法对吗?_182322ycdg1fdnm1al1hok.png

虽然你自已可以组织Protocal对象来发送,但你type这个字段值用的不对,而且type字段是留框架用的,用户只能用typeu字段。总之你照着这图上的用就对了。

另外,你那代码可以看出,你完全不看API文档就瞎撸代码,记得多看看API文档:
MobileIMSDK-Netty版服务端API文档
MobileIMSDK-Mina版服务端API文档
签名: 《即时通讯安全篇(十四):网络端口的安全防护技术实践》http://www.52im.net/thread-4644-1-1.html
                                        final String fp = Protocal.genFingerPrint();
                                        LocalSendHelper.sendData(toUserId, from_user_id, jsonPresence, true, fp,
                                                        ProtocalTypeu.ADD$FRIEND.FROM_SERVER_TYPEU_OF_SUBSCRIBE$ADD$FRIEND, new MBObserver(){

                                                @Override
                                                public void update(boolean sucess, Object extraObj) {
                                                        if(sucess)
                                                                System.out.println("Presence subscribe 发送成功!");
                                                        else
                                                                System.out.println("Presence subscribe 发送失败!");
                                                       
                                                }});



以上是我按你说的写的,但是只有messagesBeReceived得到了响应:       
@Override
        public void messagesBeReceived(String theFingerPrint)
        {
                if(theFingerPrint != null)
                {
                        Log.d(TAG, "【DEBUG_UI】收到对方已收到消息事件的通知,fp="+theFingerPrint);
                       
                        if(this.mainGUI != null)
                        {
                                this.mainGUI.showIMInfo_blue("[收到对方消息应答]fp="+theFingerPrint);
                        }
                }
        }
而我想要onTransBuffer得到响应,并处理应用层协议,但是却没有?
        public void onTransBuffer(String fingerPrintOfProtocal, String userid, String dataContent, int typeu)
        {
                Log.d(TAG, "【DEBUG_UI】[typeu="+typeu+"]收到来自用户"+userid+"的消息:"+dataContent);
               
                ProcessTypeu.processFromServerToClient(typeu, userid, dataContent);
               
                if(mainGUI != null)
                {
//                        this.mainGUI.showToast(dwUserid+"说:"+dataContent);
                        this.mainGUI.showIMInfo_black(userid+"说:"+dataContent);
                }
        }

引用:Ipensil 发表于 2018-01-12 12:18
final String fp = Protocal.genFingerPrint();
                                        LocalSendHelper.sendData(toUserId, from_user ...

onTransBuffer中收到的是对方发出的消息,而你现在显然是自已发出的,它怎么会你的收到回调里出现呢?逻辑混乱了
签名: 《即时通讯安全篇(十四):网络端口的安全防护技术实践》http://www.52im.net/thread-4644-1-1.html
我看你的sendDataC2C这个函数是客户端到客户端,其实内部也是调用了:LocalSendHelper.sendData(pFromClient, resultObserver);
我用的也是它,可以说是我自己发出去的,也可以是说服务器发出去的,
我不明白的地方是用sendDataC2C,onTransBuffer可以响应,而我不过是直接利用了它内部
调用的函数LocalSendHelper.sendData(toUserId, from_user_id, jsonPresence, true, fp,                                                   ProtocalTypeu.ADD$FRIEND.FROM_SERVER_TYPEU_OF_SUBSCRIBE$ADD$FRIEND, new MBObserver(){}
其结果是onTransBuffer 不响应,messagesBeReceived响应?
引用:Ipensil 发表于 2018-01-12 15:52
我看你的sendDataC2C这个函数是客户端到客户端,其实内部也是调用了:LocalSendHelper.sendData(pFromClien ...

你这就有点乱玩了。而且看样子你对网络编程原理也不熟悉。
你直接说需要实现什么功能,然后我告诉你应该怎么做
签名: 《即时通讯安全篇(十四):网络端口的安全防护技术实践》http://www.52im.net/thread-4644-1-1.html
a添加b为好友,我自己自定义的协议,用json问题是:服务器向b发送subscribe的时候,b收不到
思路:
首先a告诉服务器想添加b为好友;
服务器查询是否该好友存在
如果存在,服务器直接向b发出subscribe,告诉b, a想加你为好友;
如果不存在,服务器返回a,没有b这个人;
--------------------
如果b收到服务器发来的a的添加好友请求,
则直接向服务器发送subscribed告诉服务器,愿意互为好友;
服务器,修改数据库的party_relation表,两者互为好友。
修改完成后,分别向ab都发出请求,两人已经互为好友了;
引用:Ipensil 发表于 2018-01-12 16:30
a添加b为好友,我自己自定义的协议,用json问题是:服务器向b发送subscribe的时候,b收不到
思路:
首先a ...

OK,你的逻辑基本没有问题。现在的问题就是你服务端发出的消息,客户端收不到?你可以把你服务端的发送完整代码贴出来,别一次贴就那么一行或几个方法名
签名: 《即时通讯安全篇(十四):网络端口的安全防护技术实践》http://www.52im.net/thread-4644-1-1.html
        /**
         * 添加好友的协议
         */
        public interface ADD$FRIEND
        {
                /** 由客户端发出 - 协议类型:添加好友 */
                int FROM_CLIENT_TYPEU_OF_ADD$FRIEND = 1;
               
                /** 由服务器端发出 - 协议类型:服务器端收到A添加B为好友的请求后,服务端通知B,A想添加B为好友 */
                int FROM_SERVER_TYPEU_OF_SUBSCRIBE$ADD$FRIEND = 100;
               
                /** 由服务器端发出 - 协议类型:服务器告诉客户端,系统没有此人,不能添加好友 */
                int FROM_SERVER_TYPEU_OF_NO$USER = 101;
               
                /** 由客户端发出 - 协议类型:A收到服务器代B发来添加好友的请求后,B向确认服务器,同意双方互为好友 (服务器端写数据库)*/
                int FROM_CLIENT_TYPEU_OF_SUBSCRIBED$ADD$FRIEND = 2;
               
                /** 由服务端分别发给AB,告诉两者已经互为好友了*/
                int FROM_SERVER_TYPEU_OF_SUBSCRIBED$ADD$FRIEND = 102;
               
        }


/**
         * 处理 服务端 发送给 客户端 的业务响应
         * @param typeu
         * @param from_user_id
         * @param dataContent
         */
        public static void processFromServerToClient(int typeu, String from_user_id, String dataContent) {
               


                switch (typeu) {
                        case ProtocalTypeu.ADD$FRIEND.FROM_SERVER_TYPEU_OF_SUBSCRIBE$ADD$FRIEND: {
                                System.out.println("@@@@@@@@进来"+ProtocalTypeu.ADD$FRIEND.FROM_SERVER_TYPEU_OF_SUBSCRIBE$ADD$FRIEND);
                               
                                Presence presence = new Gson().fromJson(dataContent, Presence.class);
                                String type = presence.getType();
                               
                                if("subscribe".equals(type)) {  //如果同意对方加好友,就再次发送presence,type为subscribed
                                        Presence presenceSend = new Presence();
                                        presenceSend.setId(UUID.randomUUID().toString());
                                        presenceSend.setType("subscribed");
                                        String jsonPresenceSend = new Gson().toJson(presenceSend);
                                       
                                                new LocalUDPDataSender.SendCommonDataAsync(jsonPresenceSend, from_user_id,null,
                                                                ProtocalTypeu.ADD$FRIEND.FROM_CLIENT_TYPEU_OF_SUBSCRIBED$ADD$FRIEND)
                                                {
                                                        @Override
                                                        protected void onPostExecute(Integer code)
                                                        {
                                                                if(code == 0)
                                                                        Log.i(MainGUI.class.getSimpleName(), "数据已成功发出!");
                                                                else
                                                                        showToast("数据发送失败。错误码是:"+code+"!");
                                                        }
                                                }.execute();
                                }
                                break;
                        }
                        case ProtocalTypeu.ADD$FRIEND.FROM_SERVER_TYPEU_OF_NO$USER: {
                                System.out.println("@@@@@@@@进来"+ProtocalTypeu.ADD$FRIEND.FROM_SERVER_TYPEU_OF_NO$USER
                                                + "该用户不存在!!");
                                break;
                        }
                        case ProtocalTypeu.ADD$FRIEND.FROM_SERVER_TYPEU_OF_SUBSCRIBED$ADD$FRIEND: {
                                System.out.println("@@@@@@@@进来"+ProtocalTypeu.ADD$FRIEND.FROM_SERVER_TYPEU_OF_SUBSCRIBED$ADD$FRIEND
                                                + "恭喜两者已经互为好友了");
                                break;
                        }
                        default:{
                                break;
                        }
                       
                }
        }


/**
         * 处理客户端发送给服务器端的各种业务请求
         * @param typeu
         * @param from_user_id
         * @param dataContent
         * @param session
         * @throws Exception
         */
        public static void processFromClientToServer(int typeu, String toUserId, String from_user_id, String dataContent) throws Exception {

                switch (typeu) {
                        case ProtocalTypeu.ADD$FRIEND.FROM_CLIENT_TYPEU_OF_ADD$FRIEND: {
                                System.out.println("@@@@@@@@进来"+ProtocalTypeu.ADD$FRIEND.FROM_CLIENT_TYPEU_OF_ADD$FRIEND);
                               
                                IQ iq =  new Gson().fromJson(dataContent, IQ.class);
                                String toJid = iq.getJid();
                                String group = iq.getGroup();
                               
                                //查询jid是否在系统存在,如果存在就发送添加好友请求,给toJid
                                boolean isExits = true;
                                if(isExits){
                                       
                                        Presence presence = new Presence();
                                        presence.setId(UUID.randomUUID().toString());
                                        presence.setType("subscribe");
                                        String jsonPresence = new Gson().toJson(presence);
                                        /*Protocal protocal = new Protocal(-1, jsonPresence, toUserId, from_user_id,   //原来的from变为to
                                                        ProtocalTypeu.ADD$FRIEND.FROM_SERVER_TYPEU_OF_SUBSCRIBE$ADD$FRIEND);*/
                                                                               
                                        final String fp = Protocal.genFingerPrint();
                                        LocalSendHelper.sendData(toUserId, from_user_id, jsonPresence, true, fp,
                                                        ProtocalTypeu.ADD$FRIEND.FROM_SERVER_TYPEU_OF_SUBSCRIBE$ADD$FRIEND, new MBObserver(){

                                                @Override
                                                public void update(boolean sucess, Object extraObj) {
                                                        if(sucess)
                                                                System.out.println("Presence subscribe 发送成功!");
                                                        else
                                                                System.out.println("Presence subscribe 发送失败!");
                                                       
                                                }});
                                       
                                }
                                else {    //找不到此人
                                        IQ siq = new IQ();
                                        siq.setIqType("query");
                                        siq.setId(UUID.randomUUID().toString());
                                        siq.setType("error");
                                       
                                        String siqJson = new Gson().toJson(siq);
                                        Protocal protocal = new Protocal(-1, siqJson, toUserId, from_user_id, ProtocalTypeu.ADD$FRIEND.FROM_SERVER_TYPEU_OF_NO$USER);
                                       
                                        LocalSendHelper.sendData(protocal, new MBObserver(){

                                                @Override
                                                public void update(boolean sucess, Object extraObj) {
                                                       
                                                        // 数据已成功发出(给对方用户)(注意:UDP协议下如果客户端没有丢包保证机机制,服务端代发的数据不意味着用户一定能收的到哦!)
                                                        if(sucess)
                                                                System.out.println("Iq error 发送成功!");
                                                        else
                                                                System.out.println("Iq error 发送失败!");
                                                }});

                                }
                                break;
                        }
                        case ProtocalTypeu.ADD$FRIEND.FROM_CLIENT_TYPEU_OF_SUBSCRIBED$ADD$FRIEND: {
                               
                                System.out.println("@@@@@@@@进来"+ProtocalTypeu.ADD$FRIEND.FROM_CLIENT_TYPEU_OF_SUBSCRIBED$ADD$FRIEND);
                               
                                Presence presence =  new Gson().fromJson(dataContent, Presence.class);
                               
                                //收到B同意被加为好友后,修改数据库party_relation表为好友
                                //{}
                               
                                //服务器再次向a,b,subscribed,告诉两者已经互为好友了
                                presence.setId(UUID.randomUUID().toString());
                                presence.setType("subscribed");
                                String jsonPresence = new Gson().toJson(presence);
                                Protocal protocalA = new Protocal(-1, jsonPresence, toUserId, from_user_id,   //原来的from变为to
                                                ProtocalTypeu.ADD$FRIEND.FROM_SERVER_TYPEU_OF_SUBSCRIBED$ADD$FRIEND);
                               
                                LocalSendHelper.sendData(protocalA, new MBObserver(){

                                        @Override
                                        public void update(boolean sucess, Object extraObj) {
                                               
                                                // 数据已成功发出(给对方用户)(注意:UDP协议下如果客户端没有丢包保证机机制,服务端代发的数据不意味着用户一定能收的到哦!)
                                                if(sucess)
                                                        System.out.println("Presence Subscribed 发送成功!");
                                                else
                                                        System.out.println("Presence Subscribed 发送失败!");
                                        }});
                               
                               
                                Protocal protocalB = new Protocal(-1, jsonPresence, from_user_id, toUserId,  //原来的from变为to
                                                ProtocalTypeu.ADD$FRIEND.FROM_SERVER_TYPEU_OF_SUBSCRIBED$ADD$FRIEND);
                               
                                LocalSendHelper.sendData(protocalB, new MBObserver(){

                                        @Override
                                        public void update(boolean sucess, Object extraObj) {
                                               
                                                // 数据已成功发出(给对方用户)(注意:UDP协议下如果客户端没有丢包保证机机制,服务端代发的数据不意味着用户一定能收的到哦!)
                                                if(sucess)
                                                        System.out.println("Presence Subscribed 发送成功!");
                                                else
                                                        System.out.println("Presence Subscribed 发送失败!");
                                        }});
                               
                               
                                break;
                        }
                        case ProtocalTypeu.DEL$FRIEND.FROM_CLIENT_TYPEU_OF_DEL$FRIEND: {
                                break;
                        }
                        default: {
                                break;
                        }
                }

                return;
        }


        /**客户端调用处理协议的地方*/
        public void onTransBuffer(String fingerPrintOfProtocal, String userid, String dataContent, int typeu)
        {
                Log.d(TAG, "【DEBUG_UI】[typeu="+typeu+"]收到来自用户"+userid+"的消息:"+dataContent);
               
                ProcessTypeu.processFromServerToClient(typeu, userid, dataContent);
               
                if(mainGUI != null)
                {
//                        this.mainGUI.showToast(dwUserid+"说:"+dataContent);
                        this.mainGUI.showIMInfo_black(userid+"说:"+dataContent);
                }
        }
       

        /**服务端调用协议处理的地方*/
        public boolean onTransBuffer_CallBack(String userId, String from_user_id,
                        String dataContent, String fingerPrint, int typeu, Channel session)
        {
                logger.debug("【DEBUG_回调通知】[typeu="+typeu+"]收到了客户端"+from_user_id+"发给服务端的消息:str="+dataContent);
                System.out.println("【DEBUG_回调通知】[typeu="+typeu+"]收到了客户端"+from_user_id+"发给服务端的消息:str="+dataContent);
               
                try {
                        ProcessTypeu.processFromClientToServer(typeu, userId, from_user_id, dataContent);
                } catch (Exception e) {
                        // TODO Auto-generated catch blocs
                        e.printStackTrace();
                }
               
                return true;
        }

现在的情况是: ProtocalTypeu.ADD$FRIEND.FROM_CLIENT_TYPEU_OF_ADD$FRIEND,在服务端已经响应,在这个case的内部,发给客户端的协议:ProtocalTypeu.ADD$FRIEND.FROM_SERVER_TYPEU_OF_SUBSCRIBE$ADD$FRIEND,没有响应。
       

引用:Ipensil 发表于 2018-01-12 17:18
/**
         * 添加好友的协议
         */

什么鬼,你把MobileIMSDK的源码给改了?
签名: 《即时通讯安全篇(十四):网络端口的安全防护技术实践》http://www.52im.net/thread-4644-1-1.html
自定义的应用层协议在新的文件里面,对应用层协议的处理也是新的文件,只是在你的回调里面调用了一下而已
引用:Ipensil 发表于 2018-01-12 18:07
自定义的应用层协议在新的文件里面,对应用层协议的处理也是新的文件,只是在你的回调里面调用了一下而已

你直接在Demo的基础上去实现你的业务逻辑,不要轻易改动MobileIMSDK框架源码,不然MobileIMSDK升级什么的你怎么玩,而且也不利于代码管理。
另外,来来回回讨论了这么久,真的没看明白你代码怎么写的,你把你的逻辑整理一下,至少把你的代码和疑问能条理清晰的表达出来。
你的问题一定是个非常简单的理解问题,但我真没看明白你怎么玩的,到目前为止我还是在猜

签名: 《即时通讯安全篇(十四):网络端口的安全防护技术实践》http://www.52im.net/thread-4644-1-1.html
我弄好了,客户端收到信息了,原因,sendData的钱两个参数,toUserId和from_user_id写反了 。
我的逻辑:
1、重新添加一个文件ProtocalTypeu.java,这里面存放的是应用层的各个协议,也就是typeu的各种取值;
2、客户端添加一个文件processTypeu.java, 用来处理来自服务端的应用层协议请求,并响应;主要函数是:processFromServerToClient;
      此函数在客户端SDK函数: onTransBuffer回调里面调用
3、服务端也添加一个文件processTypeu.java, 用来处理来自客户端的应用层协议请求,并相应;主要函数是:processFromClientToServer;
       此函数在服务端SDK函数: onTransBuffer_CallBack回调里面调用
请问?添加好友,还有其他更好的思路吗?
引用:Ipensil 发表于 2018-01-12 20:12
请问?添加好友,还有其他更好的思路吗?

适合你的就是最好的,im本来就没有固定套路
签名: 《即时通讯安全篇(十四):网络端口的安全防护技术实践》http://www.52im.net/thread-4644-1-1.html
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部