【超详细解释】从Java NIO到Netty的每一步 (五)

Netty 组件介绍

因为Netty被用于架构或者中间件底层通讯,所以平时我并没有直接基于Netty进行编程过,所以先大概读一下用户手册,发现用户手册Netty对基本概念两三句话概括了之,所以自己先研究了下Netty核心组件的基本概念,之后再去读源码。

从抛弃服务代码讲起

接下来先上用户手册中的抛弃服务(只接收数据不做出任何响应)代码,这两个类基本涵盖了netty的基本使用,我会在代码中注释,然后开始对其核心组件进行讲解,如果大家对哪个组件不理解需要我详细展开说明的,也可以告诉我,我可以在后续进行详细介绍,不过本次仅仅介绍组件的基本概念,后续再在源码中详细介绍。

package netty;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;

public class DiscardServer {
    private int port;

    public DiscardServer(int port) {
        this.port = port;
    }

    public void run() throws Exception {
        EventLoopGroup bossGroup = new NioEventLoopGroup(); // (1)
        EventLoopGroup workerGroup = new NioEventLoopGroup();// (1)
        try {
            // Netty的服务启用类
            ServerBootstrap b = new ServerBootstrap(); 
            b.group(bossGroup, workerGroup) // (1)
                    // 简单理解为Netty自己写了一个ServerSocketChannel接收连接请求
                    .channel(NioServerSocketChannel.class) 
                    // 可以理解我们给SocketChannel添加handler对其进行处理
                    .childHandler(new ChannelInitializer<SocketChannel>() { 
                        @Override
                        public void initChannel(SocketChannel ch) throws Exception {
                            ch.pipeline().addLast(new DiscardServerHandler()); //(2)
                        }
                    })
                    //对NioServerSocketChannel进行配置
                    .option(ChannelOption.SO_BACKLOG, 128)  
                    //对SocketChannel进行配置
                    .childOption(ChannelOption.SO_KEEPALIVE, true);

            // 绑定端口开始接收请求
            ChannelFuture f = b.bind(port).sync();
            // 简单理解为关闭服务
            f.channel().closeFuture().sync();
        } finally {
            workerGroup.shutdownGracefully();
            bossGroup.shutdownGracefully();
        }
    }

    public static void main(String[] args) throws Exception {
        int port = 8080;
        if (args.length > 0) {
            port = Integer.parseInt(args[0]);
        }

        new DiscardServer(port).run();
    }
}
package netty;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

/**
 * 自定义处理I/O请求
 */
public class DiscardServerHandler extends ChannelInboundHandlerAdapter {//(3)

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        // 丢弃接收到的数据.
        ((ByteBuf) msg).release(); 
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        // 当发生异常时关闭连接.
        cause.printStackTrace();
        ctx.close();
    }

}

在接下来两章中详细讲解一下上述代码注释(1)、(2)的基本概念和理解。

关注我日常更新分享Java编程技术!希望大家都能早日走上人生巅峰!

【领取资料】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛战士从不脱下面具

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值