public class OnlineProcessor
extends java.lang.Object
根据全局算法约定,当user_id=0时即表示是服务器。
注意:由于历史原因,MobileIMSDK中的“会话”当前等同于Netty中的“Channel”,你可以认为代码中提到这两个名词时指的是同一个东西 。
限定符和类型 | 字段和说明 |
---|---|
static io.netty.util.AttributeKey<java.lang.Integer> |
ATTRIBUTE_KEY_BE_KICKOUT_CODE
用于用户会话(即Netty中的“Channel”)中存取该会话中存放的被踢原因码用的AttributeKey
|
static io.netty.util.AttributeKey<java.lang.Long> |
ATTRIBUTE_KEY_FIRST_LOGIN_TIME
用于用户会话(即Netty中的“Channel”)中存取该会话对应的首次登陆时间时用的AttributeKey
|
static io.netty.util.AttributeKey<java.lang.String> |
ATTRIBUTE_KEY_USER_ID
用于用户会话(即Netty中的“Channel”)中存取该会话对应的user_id时用的AttributeKey
|
static boolean |
DEBUG |
限定符和类型 | 方法和说明 |
---|---|
void |
__printOnline()
打印在线用户列。
|
static int |
getBeKickoutCodeFromChannel(io.netty.channel.Channel session)
尝试取出存放于用户会话中的被踢原因编码.
|
static long |
getFirstLoginTimeFromChannel(io.netty.channel.Channel session)
尝试取出存放于用户会话中的首次登陆时间.
|
static OnlineProcessor |
getInstance()
为了简化API调用,本方法将以单例的形式存活。
|
io.netty.channel.Channel |
getOnlineSession(java.lang.String user_id)
根据user_id获得该在线用户对应的 Netty UDP Channel 会话实例句柄。
|
java.util.concurrent.ConcurrentMap<java.lang.String,io.netty.channel.Channel> |
getOnlineSessions()
返回用户在线列表:key=user_id、value=会话实例引用。
|
static java.lang.String |
getUserIdFromChannel(io.netty.channel.Channel session)
尝试取出存放于用户会话中的user_id.
|
static boolean |
isLogined(io.netty.channel.Channel session)
该用户会话是否是合法的(已登陆认证)。
|
static boolean |
isOnline(java.lang.String userId)
指定用户ID的用户是否在线。
|
boolean |
putUser(java.lang.String user_id,
long firstLoginTime,
io.netty.channel.Channel newSession)
将用户放入在线列表。
|
static void |
removeAttributesForChannel(io.netty.channel.Channel session)
从指定的“会话”中清除之前保存在Channel中的Attribute属性(这一般用于会话注销等情况)。
|
boolean |
removeUser(java.lang.String user_id)
将用户从在线列表中移除.
|
static void |
setBeKickoutCodeForChannel(io.netty.channel.Channel session,
int beKickoutCode)
为指定的“会话”设置被踢原因码。
|
static void |
setFirstLoginTimeForChannel(io.netty.channel.Channel session,
long firstLoginTime)
为指定的“会话”设置首次登陆时间(后绪代码可据此时间更准确地处理多端互踢逻辑)。
|
static void |
setUserIdForChannel(io.netty.channel.Channel session,
java.lang.String userId)
为指定的“会话”设置它对应的用户ID(后绪代码可据用户ID此判定此Channel的身份)。
|
public static final io.netty.util.AttributeKey<java.lang.String> ATTRIBUTE_KEY_USER_ID
public static final io.netty.util.AttributeKey<java.lang.Long> ATTRIBUTE_KEY_FIRST_LOGIN_TIME
public static final io.netty.util.AttributeKey<java.lang.Integer> ATTRIBUTE_KEY_BE_KICKOUT_CODE
public static boolean DEBUG
public static OnlineProcessor getInstance()
public boolean putUser(java.lang.String user_id, long firstLoginTime, io.netty.channel.Channel newSession)
从 v6.0开始,本方法增加了同一账号多端登陆互踢的逻辑,且互踢逻辑考虑了复杂网络变动下的多端互踢判定方法,防止误判误踢)。 本次互踢思路,请见我在此帖中的回复:http://www.52im.net/thread-2879-1-1.html
本方法由MobileIMSDK内部决定如何调用,不建议开发者调用此方法!
user_id
- 用户的user_idfirstLoginTime
- 用户的首次登陆时间(如果是首次登陆则此值是<=0,否则为标准java时间戳)newSession
- 该用户对应的 Netty Channel 对象public void __printOnline()
本方法仅应用于DEBUG时,当在线用户数量众多时,本方法会影响性能。
public boolean removeUser(java.lang.String user_id)
本方法由MobileIMSDK内部决定如 何调用,不建议开发者调用此方法!
user_id
- 用户的user_idpublic io.netty.channel.Channel getOnlineSession(java.lang.String user_id)
user_id
- 用户的user_idpublic java.util.concurrent.ConcurrentMap<java.lang.String,io.netty.channel.Channel> getOnlineSessions()
public static boolean isLogined(io.netty.channel.Channel session)
根据MINA的原理,任何请求都会建立会话,但会话是否是合法的,则需根据 存放于其会话中的登陆属性来校验(MobileIMSDK中,已经过登陆认证的会话 ,会在其session中存放user_id,判断是否已设置user_id即可认定是否是 合法的会话)。
session
- 用户会话引用public static boolean isOnline(java.lang.String userId)
userId
- 用户IDpublic static void setUserIdForChannel(io.netty.channel.Channel session, java.lang.String userId)
session
- 用户会话引用userId
- 用户IDpublic static void setFirstLoginTimeForChannel(io.netty.channel.Channel session, long firstLoginTime)
session
- 用户会话引用firstLoginTime
- 首次登陆时间(“首次登陆”区分于断线重连,指的是第1次真正的“登陆认证”时)public static void setBeKickoutCodeForChannel(io.netty.channel.Channel session, int beKickoutCode)
目前主要用于同一账号多端登陆互踢逻辑中,用于会话close前标记之,方便
ServerEventListener.onUserLogout(String, Channel, int)
回调中可以区分该次logout事件是否源码“被踢”,以及具体的被踢原因,从而在应用层展开更丰富的逻辑处理。
session
- 用户会话引用beKickoutCode
- 被踢原因编码,编码请见 PKickoutInfo
类中的常量定义ServerEventListener.onUserLogout(String, Channel, int)
,
PKickoutInfo
public static java.lang.String getUserIdFromChannel(io.netty.channel.Channel session)
通常只有已成功登陆验证后的用户会话中才会存放它对应的user_id.
session
- 用户会话引用public static long getFirstLoginTimeFromChannel(io.netty.channel.Channel session)
session
- 用户会话引用public static int getBeKickoutCodeFromChannel(io.netty.channel.Channel session)
session
- 用户会话引用public static void removeAttributesForChannel(io.netty.channel.Channel session)
session
- 用户会话引用