默认
发表评论 4
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
[已回复] MobileIMSDK碰到一个问题,不知道是不是这个原因,帮忙看看
阅读(35437) | 评论(4 收藏 淘帖
@Override
    public void onUserLoginAction_CallBack(int userId, String userName, IoSession session) {
        System.out.println("用户登陆->UserID:" + userId);
        IMUserDAO.onLine(userId,userName,session);
        NormalChatPackage ncp= new NormalChatPackage();
        ncp.setToUserID(userId);
        ncp.setBody("你已成功登陆服务器.");
        ncp.setToUsername(userName);
        ncp.setFromUserID(0);
        ncp.setFromUsername("服务器");
        ncp.setMsgDatetime(new Date());
        ncp.setType(Enums.ChatMsgType.Text);
        ncp.setToUsername(userName);
        String strObj= JSON.toJSONString(ncp);
        try {
           serverStarter.sendData(ncp.getFromUserID(),ncp.getToUserID(),strObj,true);
        } catch (Exception e) {

            e.printStackTrace();
            System.out.println(e.getMessage());
        }
    }


我在userLogin事件中,想给登陆上来的用户发一个消息,调用sendData方法
出现一个奇怪的事情,Android 那个Demo APP整个结束掉,重新登陆 ,这个消息就发不过去
而把服务端重启,APP保持不关,服务端启动后APP自动重连成功后,这个消息就能收到了。

我查了一下SDK的代码在UserProcess.java里面有这么一段代码
        // 将用户信息放入到在线列表中(理论上:每一个存放在在线列表中的session都对应了user_id)
private HashMap<Integer, IoSession> userSessions = new HashMap<Integer, IoSession>();
        private HashMap<Integer, String> userNames = new HashMap<Integer, String>();
                                                            UserProcessor.getInstance().putUser(user_id, session, loginInfo.getLoginName());
                                                            -----------------------------------------------------------------------------------------------------------------------
                                                                this.serverEventListener.onUserLoginAction_CallBack(user_id, loginInfo.getLoginName(), session);
        


定义的地方定义了HashMap:userSessions  这个用于存放用户的IoSession
然后,盾到后面是putUser到userSessions后,就直接CallBack了回调函数

因为HashMap是非线程安全的,我怀疑是putUser还没结束,回调已经执行了,在回调中执行sendData的时候,用的是userId去发的,
也就是说,sendData函数会再一次从userSessions Map中找相对应的session
会不会因为这个原因导致取不到session,而发送没有成功?


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

标签:MobileIMSDK
上一篇:[已回复] MobileIMSDK中2台设备登录同一个ID怎么把前面登录的踢掉下一篇:[已回复] 求助关于MobileIMSDK发送消息报错的问题
推荐方案
评论 4
找到你所提问题的关键是:
1)具体的问题表现是什么?
  你现在所描述的很模糊,也没有逻辑,请组织一下语言;
2)你要实现的是什么样的功能或特性?
  如果我能理解你的想法,或许可以帮你找到最佳实践;
3)你是否清楚改动了什么地方?

我重新描述一下

我现在在做服务端开发
服务端SDK提供了onUserLoginAction_CallBack回调函数来通知我有用户登陆了
我希望在用户登陆上来的时候,给这个用户发一个自定义消息。
现在碰到的问题是这样的
使用Android_demo 正常登陆上来,服务端发的自定义消息Android客户端收不到。
但是Android_demo断线重连这种方式登陆上来,服务端发的自定义消息是能收到的。
我的问题是:怎么保证正常登陆的用户也能收到自定义消息

具体代码,上面的贴子上已经发了,SDK里代码没有改过。
代码看不出问题在哪,那就你的服务端和客户端日志也贴上来看看,记得记录日志前把不相干的日志先清一下。
明天把日志整一下发出来,刚刚又做了一次测试
用Java客户端那个demo登陆是正常收到的
有点怀疑Android demo的代码问题。
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部