来源:即时通讯网 - 即时通讯开发者社区!
轻量级开源移动端即时通讯框架。
快速入门 / 性能 / 指南 / 提问
轻量级Web端即时通讯框架。
详细介绍 / 精编源码 / 手册教程
移动端实时音视频框架。
详细介绍 / 性能测试 / 安装体验
基于MobileIMSDK的移动IM系统。
详细介绍 / 产品截图 / 安装体验
一套产品级Web端IM系统。
详细介绍 / 产品截图 / 演示视频
引用此评论
引用:JackJiang 发表于 2022-01-13 16:43 这个互踢逻辑是比较简单的,原理就是: 当新登陆时,服务端检查到之前已有登陆,就会向之前的会话发送被踢 ...
引用:荣K 发表于 2022-01-13 17:43 好的,所以说正常情况下,发生KickOut事件时,onUserLogout就应该是不会被调用的对吧?
/** * 框架中,当用户的会话被关闭时将调本本方法。 * <p> * 本方法中会将此用户从在线列表及相关队列中移除,将通过回调通知上层代码(由 * 上层代码接力实现自定义的其它业务处理)。 * <p> * <b>会话被关闭的可能性有3种:</b> * <ul> * <li>1)当客户端显式地退出网络连接时(即正常退出时);</li> * <li>2)客户端非正常关闭,但服务端的会话超时到来时;</li> * <li>3)与客户端的会话发生其它错误或异常时。</li> * </ul> * <p> * 本方法将被 {[url=home.php?mod=space&uid=5196]@link[/url] net.x52im.mobileimsdk.server.network.tcp.MBTCPClientInboundHandler#channelInactive( * io.netty.channel.ChannelHandlerContext)}调用,以便接受Netty中客户端“会话”断开通知。 * * @param session 被关闭的会话Channel引用 * @throws Exception 任何错误发生时将抛出本异常 * @see net.x52im.mobileimsdk.server.processor.OnlineProcessor#removeUser(int) * @see net.x52im.mobileimsdk.server.event.ServerEventListener#onUserLogoutAction_CallBack(int, Object) * @see net.x52im.mobileimsdk.server.network.tcp.MBTCPClientInboundHandler#channelInactive(io.netty.channel.ChannelHandlerContext) */ public void sessionClosed(Channel session) throws Exception { // 取出在连接认证时放入会话中的user_id String user_id = OnlineProcessor.getUserIdFromChannel(session); if(user_id != null) { // 从在线列表中取出会话引用 Channel sessionInOnlinelist = OnlineProcessor.getInstance().getOnlineSession(user_id); logger.info("[IMCORE-{}]{}的会话已关闭(user_id={}, firstLoginTime={})了..." , Gateway.$(session), ServerToolKits.clientInfoToString(session), user_id, OnlineProcessor.getFirstLoginTimeFromChannel(session)); // TODO just for DEBUG:以下代码仅作Debug之用,您随时可删除之! {// DEBUG Start logger.info(".......... 【0】[当前正在被关闭的session] session.hashCode={}, session.ip+port={}" , session.hashCode(), session.remoteAddress()); if(sessionInOnlinelist != null) { logger.info(".......... 【1】[处于在线列表中的session] session.hashCode={}, session.ip+port=" , sessionInOnlinelist.hashCode(), sessionInOnlinelist.remoteAddress()); } }// DEBUG END //## Bug FIX: 20171211 START // [此bug的现象是]:客户端在某种几小几率下出现每隔21秒的周期性掉线问题。原因是它的当前会话在 // 它前一个被废弃的会话(可能是客户端网络原因)超时后错误地将当前会话从在线列表移除而导致 // 的。加上此判断后,意味着被close的会话要从在线列表中移除时必须保证移除的是该会话本身,这 // 样就排除了客户端在极端网络情况下发起的新会话不会因此废弃的会话超时时而把新会话错误地从在 // 线列表中移除的问题,从而解决此bug。 // // [产生此bug的根本原因是]:在线列表中的key是user_id,而同一个user_id发起的新会话,在在线列表 // 中被放入时的逻辑时只覆盖之前的会话,而未close掉(之所以这么做是为了方便以后做多点登陆功能), // 而且在线列表就这么实现的话,当前来说并没有什么问题。 if(sessionInOnlinelist != null && session != null && session == sessionInOnlinelist) //## Bug FIX: 20171211 END { // 尽最大可能移除用户登陆成功后暂存到会话对象中的user_id OnlineProcessor.removeAttributesForChannel(session); // 从在线列表中移除 // 【理论上:】因为每个session只在用户登陆成功后才会放入列表中,那么每 // 一个存放在在线列表中的session肯定都对应了user_id。所以 // 此处先取出session中之前存放的id再把这个session从在线列表中删除 // 的算法是可以保证session被关闭的同时肯定能同步将它从在线列表中移除, // 从而保证在列表的准确性! OnlineProcessor.getInstance().removeUser(user_id); // 开始回调 if(serverEventListener != null) // 通知回调:用户退出登陆了 serverEventListener.onUserLogout(user_id, null, session); else logger.debug("[IMCORE-{}]>> 会话{}被系统close了,但回调对象是null,没有进行回调通知." , Gateway.$(session), ServerToolKits.clientInfoToString(session)); } else { logger.warn("[IMCORE-{}]【2】【注意】会话{}不在在线列表中,意味着它是被客户端弃用/或被服务端强踢,本次忽略这条关闭事件即可!" , Gateway.$(session), ServerToolKits.clientInfoToString(session)); } } else { logger.warn("[IMCORE-{}]【注意】会话{}被系统close了,但它里面没有存放user_id,它很可能是没有成功合法认证而被提前关闭,从而正常释放资源。" , Gateway.$(session), ServerToolKits.clientInfoToString(session)); } }
引用:荣K 发表于 2022-01-14 13:23 也就是说,当kickOut时,被踢者执行断开指令,然后server端这边,如果getOnlineSession拿到的session就是当 ...
/** * 用户退出登录回调方法定义(可理解为下线通知回调)。 * <p> * 服务端的应用层通常可在本方法中实现用户下线通知等。 * * @param userId 下线的用户user_id * @param obj * @param session 此客户端连接对应的 netty “会话” * @param beKickoutCode 被踢原因编码,本参数当为-1时表示本次logout事件不是源自“被踢”,否则被踢原因编码请见 PKickoutInfo类中的常量定义 * @see {@link OnlineProcessor#setBeKickoutCodeForChannel(Channel, int)} */ void onUserLogout(String userId, Object obj, Channel session, int beKickoutCode);
引用:JackJiang 发表于 2022-01-14 16:22 SDK已经改好了,用这个jar替换到你的服务端工程中:
QQ截图20220117161514.png (5.01 KB, 下载次数: 3532)
下载附件 保存到相册
2 年前 上传
精华主题数超过100个。
连续任职达2年以上的合格正式版主
为论区做出突出贡献的开发者、版主等。
Copyright © 2014-2024 即时通讯网 - 即时通讯开发者社区 / 版本 V4.4
苏州网际时代信息科技有限公司 (苏ICP备16005070号-1)
Processed in 0.125000 second(s), 42 queries , Gzip On.