public interface ServerEventListener
MobileIMSDK将允许开发者,通过此监听器,来实现用户的登陆验证、数据发送结果回调处理。
限定符和类型 | 方法和说明 |
---|---|
boolean |
onTransferMessage_RealTimeSendFaild(Protocal p)
服务端在进行消息直发(S2C消息)或转发(C2C消息)时,当对方在线但实时发送失败、以及其它各种问题导
致消息并没能正常发出时,将无条件走本回调通知。
|
void |
onTransferMessage4C2C_AfterBridge(Protocal p)
注意:本回调仅用于与Web的互通模式下,默认情况下本方法可什么也不做,无任何影响。
|
void |
onTransferMessage4C2C(Protocal p)
收到客户端发送给“其它客户端”的数据回调通知(即:消息路径为“C2C”的消息).
|
boolean |
onTransferMessage4C2CBefore(Protocal p,
io.netty.channel.Channel session)
收到客户端发送给“其它客户端”的数据回调通知(即:消息路径为“C2C”的消息)前的处理逻辑。
|
boolean |
onTransferMessage4C2S(Protocal p,
io.netty.channel.Channel session)
收到客户端发送给“服务端”的数据回调通知(即:消息路径为“C2S”的消息).
|
boolean |
onTransferMessage4C2SBefore(Protocal p,
io.netty.channel.Channel session)
收到客户端发送给“服务端”的数据回调通知(即:消息路径为“C2S”的消息)前的处理逻辑。
|
void |
onUserLoginSucess(java.lang.String userId,
java.lang.String extra,
io.netty.channel.Channel session)
用户登录验证成功后的回调方法定义(在业务上可理解为该用户的上线通知).
|
int |
onUserLoginVerify(java.lang.String userId,
java.lang.String token,
java.lang.String extra,
io.netty.channel.Channel session)
用户身份验证回调方法定义(即验证客户端连接的合法性,合法就允许正常能信,否则断开).
|
void |
onUserLogout(java.lang.String userId,
io.netty.channel.Channel session,
int beKickoutCode)
用户退出登录回调方法定义(可理解为下线通知回调)。
|
int onUserLoginVerify(java.lang.String userId, java.lang.String token, java.lang.String extra, io.netty.channel.Channel session)
服务端的应用层可在本方法中实现用户登陆验证。
注意:本回调在一种特殊情况下——即用户实际未退出登陆但再次发起来登陆包时,本回调是不会被调用的!
根据MobileIMSDK的算法实现,本方法中用户验证通过(即方法返回值=0时)后
,将立即调用回调方法 #onUserLoginSucess(int, String, Channel)
。
否则会将验证结果(本方法返回值错误码通过客户端的 ChatBaseEvent.onLoginResponse(int userId, int errorCode)
方法进行回调)通知客户端)。
userId
- 传递过来的准一id,保证唯一就可以通信,可能是登陆用户名、也可能是任意不重复的id等,具体意义由业务层决定token
- 用于身份鉴别和合法性检查的token,它可能是登陆密码,也可能是通过前置单点登陆接口拿到的token等,具体意义由业务层决定extra
- 额外信息字符串。本字段目前为保留字段,供上层应用自行放置需要的内容session
- 此客户端连接对应的 netty “会话”void onUserLoginSucess(java.lang.String userId, java.lang.String extra, io.netty.channel.Channel session)
服务端的应用层通常可在本方法中实现用户上线通知等。
注意:本回调在一种特殊情况下——即用户实际未退出登陆但再次发起来登陆包时,回调也是一定会被调用。
userId
- 传递过来的准一id,保证唯一就可以通信,可能是登陆用户名、也可能是任意不重复的id等,具体意义由业务层决定extra
- 额外信息字符串。本字段目前为保留字段,供上层应用自行放置需要的内容。为了丰富应用层处理的手段,在本回调中也把此字段传进来了session
- 此客户端连接对应的 netty “会话”void onUserLogout(java.lang.String userId, io.netty.channel.Channel session, int beKickoutCode)
服务端的应用层通常可在本方法中实现用户下线通知等。
userId
- 下线的用户user_idsession
- 此客户端连接对应的 netty “会话”beKickoutCode
- 被踢原因编码,本参数当为-1时表示本次logout事件不是源自“被踢”,否则被踢原因编码请见 PKickoutInfo
类中的常量定义OnlineProcessor.setBeKickoutCodeForChannel(Channel, int)
boolean onTransferMessage4C2SBefore(Protocal p, io.netty.channel.Channel session)
本方法的默认实现:当开发者不需要本方法进行额外逻辑处理时,请直接返回true即可!
本方法的典型用途:开发者可在本方法中实现如:用户聊天内容的鉴黄、过滤、篡改等等,把内容审读权限交给开发者,就看怎么用了。
p
- 消息/指令的完整协议包对象session
- 消息发送者的“会话”引用(也就是客户端的网络连接对象)onTransferMessage4C2S(Protocal, Channel)
继续正常逻辑 ,false表示该条指令将不会继续处理(直接被丢弃)onTransferMessage4C2S(Protocal, Channel)
boolean onTransferMessage4C2CBefore(Protocal p, io.netty.channel.Channel session)
本方法的默认实现:当开发者不需要本方法进行额外逻辑处理时,请直接返回true即可!
本方法的典型用途:开发者可在本方法中实现如:用户聊天内容的鉴黄、过滤、篡改等等,把内容审读权限交给开发者,就看怎么用了。
p
- 消息/指令的完整协议包对象session
- 消息发送者的“会话”引用(也就是客户端的网络连接对象)onTransferMessage4C2C(Protocal)
继续正常逻辑 ,false表示该条指令将不会继续处理(直接被丢弃)onTransferMessage4C2C(Protocal)
boolean onTransferMessage4C2S(Protocal p, io.netty.channel.Channel session)
MobileIMSDK在收到客户端向userId="0"(即接收目标是"服务器")的情况下通过本方法的回调通知上层。
本方法的典型用途:开发者通常可在本方法中实现如:添加好友请求等需要服务端进行处理的业务。
p
- 消息/指令的完整协议包对象session
- 消息发送者的“会话”引用(也就是客户端的网络连接对象)Protocal
void onTransferMessage4C2C(Protocal p)
注意:本方法当且仅当在数据被服务端成功实时发送(“实时”即意味着对方在线的情况下)出去后被回调调用.
本方法的典型用途:开发者可在本方法中可以实现用户聊天信息的收集,以便后期监控分析用户的行为等^_^。 开发者可以对本方法不作任何代码实现,也不会影响整个MobileIMSDK的运行,因为本回调并非关键逻辑,只是个普通消息传输结果的回调而已。
提示:如果开启消息QoS保证,因重传机制,本回调中的消息理论上有重复的可能,请以参数 #fingerPrint 作为消息的唯一标识ID进行去重处理。
p
- 消息/指令的完整协议包对象Protocal
boolean onTransferMessage_RealTimeSendFaild(Protocal p)
注意:本方法当且仅当在数据被服务端在线发送失败后被回调调用.
举个例子:以下是一段典型的服务端消息/指令发送代码:
// 消息接收者的id(这个id由你自已定义,对于MobileIMSDK来说只要保证唯一性即可) String destinationUserId = "400069"; // 这是要发送的消息("你好"是消息内容、“0”是消息发送者) final Protocal p = ProtocalFactory.createCommonData("你好", "0", destinationUserId, true, null, -1); // 对方在线的情况下,才需要实时发送,否则走离线处理逻辑 if(OnlineProcessor.isOnline(destinationUserId)) { // netty是异步通知数据发送结果的 MBObserver<Object> resultObserver = new MBObserver<Object>(){ public void update(boolean sucess, Object extraObj) { if(sucess){ // 你的消息/指令实时发送成功,不需要额外处理了 } else{ //【1】TODO: 你的消息/指令实时发送失败,在这里实现离线消息处理逻辑! } } }; //【2】开始实时消息/指令的发送 LocalSendHelper.sendData(p, resultObserver); } else{ //【3】TODO: 你的离线消息处理逻辑! }
如上代码所示:“【1】【3】”代码处,开发者可以自行明确地进行离线逻辑处理,“【2】”处如 果实时发送时出现任何问题,将会走本回调方法进行通知,框架正是通过此回调进一步确保消息可靠性保证的。
本方法的典型用途:
开发者可在本方法中实现离线消息的持久化存储(反正进到本回调通知的消息,就是应该被离线存储起来的)。
此方法存的意义何在?
发生此种情况的场景可能是:对方确实不在线(那么此方法里就可以作为离线消息处理了)、或者在发送时判断对方是在线的
但服务端在发送时却没有成功(这种情况就可能是通信错误或对方非正常通出但尚未到达会话超时时限)。
应用层在
此方法里实现离线消息的处理即可!
p
- 消息/指令的完整协议包对象Protocal
,
onTransferMessage4C2C(Protocal)
void onTransferMessage4C2C_AfterBridge(Protocal p)
本回调用于与Web的消息互通结束后(无论成功与否),通知应用层的回调,应用层可以在此回调中实现离线消息Push逻辑。
此方法存的意义何在?
因为C2C模式的消息不像C2S模式,它的S2C这一段不是由开发者来发送(而是封装在SDK里),所以当跟Web进行桥接时,C2C模式下的好友
聊天消息,就没有途径由开发者自已来加入离线消息Push逻辑了,于是v6.2版增加了此回调,目的仅限于此。如果你对此逻辑想不通或存疑
,建议可以跟Jack Jiang进行讨论!
p
- 消息/指令的完整协议包对象