Netty私有协议栈开发

本文详细介绍了如何使用Netty开发私有协议栈,涵盖了消息协议定义、消息编解码、连接认证、链路校验和重连机制等方面。通过消息头+消息体的设计,利用Marshaller进行Object编解码,确保数据传输的可靠性。同时,实现了基于IP白名单的安全认证和心跳检查机制,以及链路超时检测和断开重连功能,确保了连接的稳定性和安全性。此外,还讨论了可扩展性设计,通过附加attachment来方便扩展。文章最后提供了具体实现细节和相关学习资源。
摘要由CSDN通过智能技术生成

几个基本功能描述
消息协议定义,消息编解码,连接认证,链路有效性校验机制,链路的断开重连机制。
主要设计
消息协议设计:消息头+消息体。消息头定义了基本协议字段定义,添加attachment方便扩展。Object编解码使用Marshaller。
链路交互设计:链路什么时候建立,什么时候关闭,握手请求与相应。
可靠性设计:心跳检查机制,重连机制,重复登录保护,消息缓存重发。
安全性设计:本章使用基于ip地址的白名单安全认证机制。
可扩展性设计:添加attachment方便扩展。
顺便给大家推荐一个Java技术交流群:473984645里面会分享一些资深架构师录制的视频资料:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多!
具体实现
编解码
编码
编码类继承MessageToByteEncoder,然后编码类重写了encode方法,把具体的消息存放到ByteBuf中就可以了。
解码
解码类继承LengthFieldBasedFrameDecoder:可以根据消息的长度进行拆包,自动的TCP粘包、半包处理。然后解码类重写decode方法进行解析即可。
如上编解码中使用Marshaller对Object对象编解码。
握手与安全认证
TCP建立连接之后,客户端发起握手,服务端进行验证,
客户端LoginAuthReqHandler
重写了channelActive方法,发送登录请求。

  @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
   
    ctx.writeAndFlush(buildLoginReq());
    }
    private NettyMessage buildLoginReq() {
   
    NettyMessage message = new NettyMessage();
    Header header = new Header();
    header.setType(MessageType.LOGIN_REQ.value());
    message.setHeader(header);
    return message;
    }

重写了channelRead方法

@Override
    public void channelRead(ChannelHandlerContext ctx, Object msg)
        throws Exception {
   
    NettyMessage message = (NettyMessage) msg;
    // 如果是握手应答消息,需要判断是否认证成功
    if (message.getHeader() != null
        && message.getHeader().getType() == MessageType.LOGIN_RESP
            .value()) {
   
        byte loginResult = (byte) message.getBody();
        if (loginResult != (byte) 0) {
   
        // 握手失败,关闭连接
        ctx.close();
        } else {
   
        System.out.println("Login is ok : " + message);
        ctx.fireChannelRead(msg);
        }
    } else
        ctx.fireChannelRead(msg);
    }

服务端LoginAuthRespHandler

@Override
    public void channelRead(ChannelHandlerContext ctx, Object msg)
        throws Exception {
   
    NettyMessage message = (NettyMessage) msg;
    // 如果是握手请求消息,处理,其它消息透传
    if (message.getHeader() != null
        && message.getHeader().getType() == MessageType.LOGIN_REQ
            .value()) {
   
        String nodeIndex = ctx.channel().remoteAddress().toString();
        NettyMessage loginResp = null;
        // 重复登陆,拒绝
        if (nodeCheck.containsKey(nodeIndex)) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值