通过MessagePack框架将用户信息进行JSON格式数据传输给服务端,进行账号密码验证登录,推荐从前面的章节开始看。
LoginAuthReqHandler.java
import com.alibaba.fastjson.JSONObject;
import com.fyrt.fyrtim.util.*;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import lombok.extern.slf4j.Slf4j;
/**
* 用户登录 客户端
*/
@Slf4j
public class LoginAuthReqHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
NettyMessage nettyMessage =(NettyMessage) JsonUtil.parseNettyMessage(msg);
if (JsonUtil.booleanToJson(nettyMessage.getMsg())) {
LoginUtil.markAsLogin(ctx.channel());
log.info(UserChannelUtil.user().getUserId()+"登录成功");
// 登录成功则删除当前handler的验证
ctx.pipeline().remove(this);
//登录成功跳转到下咦个handler
ctx.fireChannelActive();
}else{
log.info("登录失败");
//登录失败则关闭通道
ctx.channel().close();
}
}
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
//用户数据编写
NettyMessage nettyMessage = new NettyMessage(TransportType.OBJECT.getValue(),UserChannelUtil.user(),ctx.channel());
String body = JSONObject.toJSONString(nettyMessage);
//发送数据到服务端
ctx.writeAndFlush(body);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
//打印异常信息并关闭通道
cause.printStackTrace();
ctx.close();
}
@Override
public void handlerRemoved(ChannelHandlerContext ctx) {
//从当前channel中查询是否存在登录信息
if (LoginUtil.hasLogin(ctx.channel())) {
System.out.println("当前连接登录验证完毕,无需再次验证");
} else {
System.out.println("无登录验证,强制关闭连接!");
}
}
}
LoginAuthRespHandler.java
import com.fyrt.fyrtim.util.*;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import lombok.extern.slf4j.Slf4j;
/**
* 用户登录 服务端
*/
@Slf4j
public class LoginAuthRespHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
NettyMessage nettyMessage = (NettyMessage) JsonUtil.parseNettyMessage(msg);
//未登录 从全局map中判断是否存在有登录信息
if (!nettyMessage.isLogin()){
User user = (User) JsonUtil.parseObject(nettyMessage.getMsg(), User.class);
boolean flag=true;
//验证账号密码
if (user.getAccount().equals("admin") && user.getPassword().equals("test")){
flag=true;
//登录成功将数据绑定到当前channel中
UserChannelUtil.bindUser(user,ctx.channel());
}else {
flag=false;
}
log.info(String.valueOf(flag));
NettyMessage nettyMessage1=new NettyMessage(TransportType.FLAG.getValue(),flag,ctx.channel());
ctx.writeAndFlush(JsonUtil.objectToJson(nettyMessage1));
} else {
ctx.fireChannelRead(msg);
}
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
cause.printStackTrace();
ctx.close();
}
}
实现效果:
代码已上传至github:https://github.com/beibeirenzhe/netty-im/tree/master/fyrtim