Netty傻瓜教程(六):开始点对点聊天吧

首先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

相关文章
相关标签/搜索