牛与什么生肖最配| 为什么哭了眼睛会肿| mmhg是什么意思| 双重性格是什么意思| 硕的拼音是什么| 脚底疼痛是什么原因| 窦性心律有什么危害| 泰迪吃什么| k金是什么| 山西属于什么地区| 维生素b2起什么作用| 嘴唇黑是什么原因| nt什么货币| 什么样的人不能坐飞机| 管教有方是什么意思| 大姨妈来了吃什么对身体好| 杂菌2个加是什么意思| 三眼花翎是什么意思| 生育登记有什么用| 洗白是什么意思| 甘露醇治什么病| 嘴角长痘痘是什么原因| 石几念什么| 孩子睡觉咬牙齿是什么原因引起的| fog是什么牌子| 麻了是什么意思| pvd是什么材料| 草酸是什么| 出其不意下一句是什么| 女性长期缺维d会带来什么病| 湿疹用什么| 什么叫低级别上皮内瘤变| 蒲公英可以和什么一起泡水喝| 丈青色是什么颜色| 视网膜脱落是什么原因引起的| female什么意思| 平安夜送女朋友什么| 消化不良吃什么水果| 三月十九是什么星座| 记字五行属什么| 前面有个豹子是什么车| 健身吃什么长肌肉最快| 灰姑娘叫什么名字| 什么工作轻松| 治疗荨麻疹用什么药最好| mm是什么病| 疱疹是一种什么病| 吃什么提高免疫力最好最快| ihc是什么意思| 什么时候满月| 垂体泌乳素高是什么原因| 身体缺钾是什么症状| 王妃是什么意思| 头皮上长疣是什么原因造成的| 黄瓜苦是什么原因| 乳腺实性结节是什么意思| 吃善存片有什么好处| 孕妇上火了吃什么降火最快| 小叶紫檀五行属什么| ABB式的词语有什么| 什么酒好喝| 虫草适合什么人吃| 丹凤眼是什么样| 什么动物吃草| 旅游的意义是什么| 每天坚持跑步有什么好处| 菠萝蜜过敏什么症状| 1985年属牛的是什么命| 小麦淀粉可以做什么| 翔五行属什么| 甲状腺结节看什么科| 口腔医学专业学什么| 食禄是什么意思| 十二指肠溃疡是什么症状| 益生元和益生菌有什么区别| 13朵玫瑰代表什么意思| 香菜不能和什么一起吃| 核桃什么时候成熟| 肝损害是什么意思| 89年属蛇是什么命| 69什么意思| 痱子长什么样子图片| 挑刺是什么意思| 葡萄糖输液有什么作用| 饱的偏旁叫什么| 大量出汗是什么原因引起的| 新生儿缺氧会有什么后遗症| bgm网络语什么意思| 稼字五行属什么| 插入是什么感觉| cabbeen是什么牌子| 烤鱼一般用什么鱼| 西地那非是什么药| 谷丙转氨酶偏高吃什么药| 西梅是什么季节的水果| 拔牙有什么危害| 得宫颈癌的前兆是什么| 运动出汗多是什么原因| 书字五行属什么| 子癫是什么病| 什么是再生纤维| 2006属狗的五行缺什么| 38岁属什么| s是什么牌子| 百什么齐什么| 晟怎么读音是什么| 什么是蜘蛛痣图片| 什么是失信被执行人| 妊娠试验阴性是什么意思| 舌头有齿痕吃什么药| 肋骨骨折吃什么食物好得快| 怀孕之后身体有什么变化| 吐槽是什么意思| 麻长什么样子图片| 子宫增大是什么原因造成的| 万中无一什么意思| 2月22日什么星座| 鸡蛋黄发红是什么原因| 菁是什么意思| 降甘油三酯吃什么食物最好| 胸痛挂什么科| 豁口是什么意思| 刚生完孩子的产妇吃什么水果好| 吃什么补气血| 三言两语是什么意思| 黄花菜都凉了是什么意思| 恐龙是什么时候灭绝| 阴沉木是什么木头| a1代表什么意思| 玉兰片和竹笋有什么区别| 嘴发麻是什么原因引起的| 支原体感染是什么意思| 什么水果热量低| 酉时左眼跳是什么预兆| 护发素什么牌子好| 京豆有什么用| 羊水是什么味道| 吃什么能胖起来| 黑洞是什么| 肝斑一般在脸上的什么地方| 尿微肌酐比值高是什么情况| 去胎毒吃什么最好| 岁寒三友是指什么| 指甲容易断裂是什么原因| 什么人容易得格林巴利| 丝瓜络是什么东西| 头晕吃什么药| 翡翠戴久了会有什么变化| 为什么会缺铁性贫血| 什么是莱赛尔纤维| 11月9号是什么星座| 脉络是什么意思| pet一ct是一种什么检查| 什么是软装| 男子精少吃什么药可以生精| cm是什么| 女生肚脐眼下面疼是什么原因| 白蛋白是什么| 赵本山什么时候去世的| 孕妇梦见猪是什么意思| 皮的偏旁是什么| 降维打击是什么意思| 3p什么意思| 梦见手机摔碎了是什么意思| 冬枣什么时候上市| joy什么意思| 筑基是什么意思| 昙花一现什么意思| 卧推80公斤什么水平| 傍家儿是什么意思| 睡醒后口苦是什么原因| 什么是面首| 白扁豆长什么样| 解禁是什么意思| 喝苦荞茶有什么好处| 元五行属什么| 一个句号是什么意思| 皮肤瘙痒是什么原因| 咳白痰吃什么药效果好| 为什么会基因突变| 尿路感染要吃什么药| 约炮什么意思| 什么是八爪鱼| 梦见抓螃蟹是什么征兆| 暗疾是什么意思| 脱发吃什么| 什么是精神出轨| 孕妇尿路感染吃什么药| 蚯蚓可以钓什么鱼| 自负是什么意思| 吃什么减肥最好最快| vivi是什么意思| 水能是什么| 偷什么不犯法| 咳嗽可以吃什么水果| 六月初七是什么星座| 西湖醋鱼是什么菜系| 什么而不| 白芝麻有什么功效| 甘露醇是什么药| 啸是什么生肖| 卯宴席是什么意思| 湿气太重吃什么药最好| 小人难防前一句是什么| 50分贝相当于什么声音| 项链突然断了预示什么| 广东人吃什么| 带银饰有什么好处| 盲从什么意思| 人瘦了是什么原因| 冠心病是什么| 心脏早搏有什么危险| 喘不过气是什么原因| 吃什么拉什么| 头胀痛吃什么药| 多吃玉米有什么好处和坏处| 吉吉念什么| 吃石斛有什么功效| 一周不排便是什么原因| 慈母手中线的下一句是什么| 人际关系是什么意思| 一国两制什么时候提出的| 彰字五行属什么| 缺铁性贫血吃什么好| 何首乌泡酒有什么作用| c2是什么| 英五行属什么| 白化病是一种什么病| 眩晕症是什么原因引起| 实至名归是什么意思| 七月八日是什么日子| 京酱肉丝是什么菜系| 今年为什么这么热| 本命佛是什么意思| 捡和拣有什么区别| 为什么不能指彩虹| 5月5日是什么星座| 中午十一点是什么时辰| 朋字五行属什么| 爸爸是什么意思| 脂蛋白a是什么| 咩是什么意思| 芝士可以做什么美食| 长命锁一般由什么人送| 项链突然断了预示什么| 白凉粉是什么东西| 做梦梦到小孩子是什么意思| 反流性咽喉炎吃什么药最好| 高危hpv有什么症状| zoom什么意思| cas是什么| 失物招领是什么意思| 手麻脚麻吃什么药| 子宫内膜什么时候脱落| 什么是慰安妇| 武警和特警有什么区别| 欧阳修是什么居士| 发明什么| 红是什么意思| 宋江的绰号是什么| 自在是什么意思| 定海神针是什么意思| 送什么生日礼物给妈妈| 桃花是什么季节开的| 百度

默认
发表评论 13
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
[已回复] RainbowChat-Web上线下线通知监听器ChatServerEventListener疑问
需求是这样的:1、在好友列表显示在线状态;
2、好友上线、离线实时更新列表状态。

第一个问题,我看到有 missu_users.is_online 字段存储在线状态,但是发现这块代码没有生效。
首先,可以确认启动时ChatServerEventListener 已经注册了。
当好友上线时,onUserLoginVerify 和 onUserLoginSucess 都没有被调用,不知道是啥原因。
我拿到的代码很多逻辑是注释掉的,直接return 0。

@Override
public int onUserLoginVerify(String userId, String token, String extra, Channel session)
{
    return 0;
}

我有看了下,问题可能是:前端 HTTP 认证完成,通过 token 连接到 im 服务器时,没有触发 onUserLoginVerify 事件?
// 发起首次连接和认证
            this._socket = io.connect(wsUrl, {
                query: 'token='+JSON.stringify(w.IMSDK._loginInfo),
                forceNew:true,               // 20170110:加了此选项才能让客户端socketio.disconnect()生效!
                secure:supportSSL?true:false // 20170526:是否支持SSL/TLS
            });


function callBack_CheckAuthToken(loginInfo, fn) {

  //*********************************************************************** START
  // TODO 你可在此填写登陆/掉线重连认证代码实现:(true表示验证成功,false表示失败) START
  //var authOK = false; // 验证失败!
  var authOK = true;    // 验证成功!
  // TODO 你可在此填写登陆/掉线重连认证代码实现:(true表示验证成功,false表示失败) END
  //*********************************************************************** END

  logger.info('[IM应用层-回调] 已收到sdk的连接认证回调,loginInfo=%s, 认证结果=%s', JSON.stringify(loginInfo), authOK);

  // 此回调请原样照写,不可更改:即将认证结果传回第2层回调(fn回调函数来自SDK内部,原样传过去即可)
  fn(null, authOK);
}


到底怎么做才能触发 ChatServerEventListener.onUserLoginVerify?













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

推荐方案
评论 13
你这一会儿贴java代码,一会贴js代码,不要把思路搞乱了。
你如果是要给web端增加在线状态,只需要在服务端的js代码里去实现。你原版代码里,某人的登录和退出,服务端的回调里都会有log显示,不可能没反应,不然系统就不正常了,你可以跟读一下log
引用:JackJiang 发表于 2025-08-04 15:07
你这一会儿贴java代码,一会贴js代码,不要把思路搞乱了。
你如果是要给web端增加在线状态,只需要在服务 ...

现在的问题就是ChatServerEventListener 的 onUserLoginVerify 和 onUserLoginSucess 都没有被调用。能告诉我怎么触发这两个方法吗,有例子吗给我一个?
我需要在左边的好友列表,显示所有好友的在线离线状态。

前端的上线下线 log 是有的。
[已回复] RainbowChat-Web上线下线通知监听器ChatServerEventListener疑问_微信图片_20250614220236_204.png


引用:batizhao 发表于 2025-08-04 21:58
现在的问题就是ChatServerEventListener 的 onUserLoginVerify 和 onUserLoginSucess 都没有被调用。能告 ...

把交付给你的原版代码跑起来,看看这两个回调,一定能被调用:

[已回复] RainbowChat-Web上线下线通知监听器ChatServerEventListener疑问_QQ20250615-203213.png
引用:JackJiang 发表于 2025-08-04 20:33
把交付给你的原版代码跑起来,看看这两个回调,一定能被调用:

callBack_userOnline 和callBack_userOffline 这两个方法是被调用了,从我上个图的日志可以看出。

但是对于我的需求来说不够呀。我需要有所有人的在线离线状态,这个必须在后端存储吧?
我看了数据库是通过 missu_users.is_online 字段存储在线状态,但是这个字段是 ChatServerEventListener 的 onUserLoginVerify 和 onUserLoginSucess 方法有关系,而这两个方法,现在都没被调用到。
我看了下前端代码,应该在这里触发 onUserLoginVerify 的吧?但是这里直接跳过后端校验了。
function callBack_CheckAuthToken(loginInfo, fn) {

  //*********************************************************************** START
  // TODO 你可在此填写登陆/掉线重连认证代码实现:(true表示验证成功,false表示失败) START
  //var authOK = false; // 验证失败!
  var authOK = true;    // 验证成功!
  // TODO 你可在此填写登陆/掉线重连认证代码实现:(true表示验证成功,false表示失败) END
  //*********************************************************************** END

  logger.info('[IM应用层-回调] 已收到sdk的连接认证回调,loginInfo=%s, 认证结果=%s', JSON.stringify(loginInfo), authOK);

  // 此回调请原样照写,不可更改:即将认证结果传回第2层回调(fn回调函数来自SDK内部,原样传过去即可)
  fn(null, authOK);
}

引用:batizhao 发表于 2025-08-04 08:56
callBack_userOnline 和callBack_userOffline 这两个方法是被调用了,从我上个图的日志可以看出。

但 ...

怎么就不够了。
谁上线了,你就把它放到你的集合里,谁下线了,你就把它从集合里去掉,这集合里的人不就是所有在线的人了吗
引用:JackJiang 发表于 2025-08-04 09:52
怎么就不够了。
谁上线了,你就把它放到你的集合里,谁下线了,你就把它从集合里去掉,这集合里的人不就 ...

我看了下前端是有个userProcessor 来处理在线列表的,我让开发试试吧。

我是在后端看到missu_users表有个is_online 字段,跟代码看到有个UsersStatusManager,看到和 ChatServerEventListener 的 onUserLoginVerify、 onUserLoginSucess 方法有关系,所以在看后端这条路子。

【接口1008-2-7】获取好友列表过程,现在看下来,这个 is_online 根本没用到是吧?
// 遍历在线好友列表,看看该好友是否在线(在线用户列表中的key可能是user_uid也可能是user_mail,
					// 因为客户端允许用户使用uid和mail二种方式登陆)
					if(ChatServerEventListener.getInstance().getLiverUsersMgr().isOnline(friend_user_uid))
					{
						// 设置在线状态为“在线”
						friend.setLiveStatus(1);
					}

引用:batizhao 发表于 2025-08-04 10:25
我看了下前端是有个userProcessor 来处理在线列表的,我让开发试试吧。

我是在后端看到missu_users表 ...

那个数据库表里的字段不要去纠结,那只是app产品里用于后端运维系统时看看而已。

按我说的一定能实现,也是最佳实践,因为app产品里就是这么实现,这两个上线下线的回调在sdk里设计的目的也就是为了让你这么去用的
引用:JackJiang 发表于 2025-08-04 11:01
那个数据库表里的字段不要去纠结,那只是app产品里用于后端运维系统时看看而已。

按我说的一定能实现 ...

有代码可以参考吗?

1、在好友列表加载的时候可以区分在线、离线,并且在线用户排在前边;
2、好友上线离线,对列表进行实时更新。
引用:batizhao 发表于 2025-08-04 16:26
有代码可以参考吗?

1、在好友列表加载的时候可以区分在线、离线,并且在线用户排在前边;

最简单的办法:
1)谁上线,谁下线,在现有的服务端上线下线接口里,去更新这个人的数据库表is_online字段;
2)服务端好友列表读取时,同时读取is_online字段,并按is_online排序ORDER is_online DESC;
3)客户端实时上下线就是对好友列表进行数组重新排序,排序的同时在DOM里去更新ui

就这么点事
引用:JackJiang 发表于 2025-08-04 16:40
最简单的办法:
1)谁上线,谁下线,在现有的服务端上线下线接口里,去更新这个人的数据库表is_online字 ...

我原先就是这么想的,所以第一步,上线下线更新 is_online,我看代码是通过ChatServerEventListener这个监听器来实现的,但是这个监听器现在onUserLoginVerify、onUserLoginSucess、onUserLogout 这些方法都不起作用,不知道怎么触发啊。我不可能自己实现这个逻辑吧?

ChatServerEventListener - onUserLoginVerify(return 0) - onUserLoginSucess - ChatLogicManager.processUserLoginAction(更新 is_online,给在线好友发上线消息)

ChatServerEventListener - onUserLogout - ChatLogicManager.processUserLogoutAction(更新 is_online,给在线好友发下线消息)

实在不行,我就登录成功RosterElementEntity authedUser = MyControllerJSON.authrizationLogin(ai, req.getRemoteHost(), false);后,自己调用ChatLogicManager.processUserLoginAction(userId, extra, session)这个方法。
引用:JackJiang 发表于 2025-08-04 16:40
最简单的办法:
1)谁上线,谁下线,在现有的服务端上线下线接口里,去更新这个人的数据库表is_online字 ...

我现在是这么处理的:
上线 MyControllerJSON.authrizationLogin 方法,增加

ChatLogicManager.processUserLoginAction(userAuthedInfo.getUser_uid(), null, null);


离线 MyControllerJSON.authrizationLogout 方法,增加
ChatLogicManager.processUserLogoutAction(ao.getUid(), null, 0);


现在可以实现 is_online 字段的更新。

但是还有个问题,我需要发消息给所有的在线好友上线了,这里我看用到了这个集合:
ConcurrentMap<String, Channel> liveUsers = 
                                ChatServerEventListener.getInstance().getLiverUsersMgr().getLiveUsers();


那么需要维护这个集合:
OnlineProcessor.getInstance().putUser(userAuthedInfo.getUser_uid(), System.currentTimeMillis(), null);


现在的问题是:public boolean putUser(String user_id, long firstLoginTime, Channel newSession) 第三个参数怎么传?我试了 null 有问题。我想这里我不用liveUsers,直接用is_online 判断给谁发消息算了,可行吗?


引用:batizhao 发表于 2025-08-04 11:59
我现在是这么处理的:
上线 MyControllerJSON.authrizationLogin 方法,增加

完全没看明白你在干啥咧。
你不是搞web端的状态吗,怎么又搞到app的服务端来了,不能把逻辑理清了再动手吗。。不理解的逻辑可以先加Log看看它的执行逻辑
不是,你看懂我的目的了吗?
1、好友列表显示在线状态;
2、好友列表状态实时刷新。
你一会说:只需要在服务端的js代码里去实现;又说:去更新这个人的数据库表is_online字段
你搞清楚了吗?怎么这么费劲啊。
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部
怀孕天数从什么时候算起 肤色暗黄适合穿什么颜色的衣服 什么是七七事变 刻骨铭心是什么意思 属兔五行属什么
孕妇什么水果不能吃 笃什么意思 为什么人会得抑郁症 睡莲为什么不开花 子宫内膜是什么
地黄泡水喝有什么好处 为什么会有牙结石 痔核是什么样子图片 肺炎支原体抗体阳性是什么意思 2017属什么生肖
尿液中有泡沫是什么原因 男孩适合学什么专业 美国为什么要打伊朗 西安五行属什么 虎的偏旁是什么
三月十七是什么星座hcv9jop6ns1r.cn 艾灸治什么病cl108k.com 人体缺钾会有什么症状hcv8jop7ns9r.cn 中度肠化是什么意思gysmod.com 血压200意味着什么hcv8jop6ns5r.cn
鼻窦炎挂什么科hcv8jop9ns2r.cn 儿童手指头脱皮什么原因引起的hcv8jop6ns4r.cn 肉蔻是什么样子hcv7jop7ns3r.cn 脑供血不足做什么检查能查出来hcv9jop1ns9r.cn 什么样的马hcv9jop2ns9r.cn
夜未央是什么意思fenrenren.com 甲低有什么危害hcv9jop0ns2r.cn 鸡是什么动物hcv9jop2ns3r.cn 大手牵小手是什么菜hcv9jop5ns5r.cn 阴险表情什么意思zhongyiyatai.com
扶他林是什么药hcv9jop7ns9r.cn 面子是什么意思hcv8jop8ns2r.cn 女生经常手淫有什么危害weuuu.com 两个大于号是什么车hcv8jop4ns4r.cn 抗酸杆菌是什么hcv9jop2ns2r.cn
百度