概述
首先Netty服务器收到了消息:
@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)即可。
最后
以上就是务实小馒头为你收集整理的php socket 点对点聊天,Netty傻瓜教程(六):开始点对点聊天吧的全部内容,希望文章能够帮你解决php socket 点对点聊天,Netty傻瓜教程(六):开始点对点聊天吧所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复