首先Netty服务器收到了消息:java
@Override public void channelRead(final ChannelHandlerContext ctx, Object msg) throws Exception { // message 解析 Message receiveMsg = (Message) msg; // 相应的Handler AppMsgHandler msgHandler = AppMsgHandlerFactory .getAppMsgHandler(receiveMsg); if (msgHandler != null) { msgHandler.process(ctx.channel(), receiveMsg); } else { // 没找到相应的handler Log.error("no handler,msg2:" + receiveMsg.toString()); } }
1. AppMsgHandlerFactory.getAppMsgHandler(receveMsg),获取处理特定消息类型的Handler,好比识别是登录信息,仍是单聊信息,仍是心跳信息,或是心跳应答等等。若是不为空,则对消息进行处理,调用msgHandler.process(ctx.channel(), receiveMsg),这里传入两个参数,ctx.channel()就是标识每一个会话的通道。数据库
若是收到的是登录信息:服务器
@Override public void process(Channel channel, Message msg) { try { LoginInfo loginInfo = msg.getLoginInfo(); long userId = loginInfo.getUserId(); String token = loginInfo.getToken(); String platform = loginInfo.getPlatform().toLowerCase(); String appVersion = loginInfo.getAppVersion(); Log.info(LogTAGManager.CLIENT_LOGIN_INFO + "userId:" + userId + LogTAGManager.LOG_SEPARATE_PARAMS + "token:" + token + LogTAGManager.LOG_SEPARATE_PARAMS + "platform:" + platform + LogTAGManager.LOG_SEPARATE_PARAMS + "appversion:" + appVersion); // token验证 String user_token = RedisDBProvider.getUserInfo(userId, "user_token"); if ((user_token == null || "".equals(user_token) || (!user_token .equals(token)))) { int code = 1; String info = "登陆验证失败"; int expose = 1; AppRouterManager .routeError(channel, code, info, expose, userId); channel.close(); return; }
登录成功以后,若是客户端又发来了聊天信息,那么识别信息的toUserId,从数据库里面查一下此用户有没有登录,若是已经登录,那么调用SendMsg(channel, toUserId)便可。app