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

首先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)即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值