Netty源码分析----服务启动之Channel初始化

本文深入分析Netty服务启动过程中Channel的初始化,包括创建Channel并设置非阻塞、Channel绑定地址以及注册到Selector的详细步骤。通过源码解析,揭示Netty如何封装NIO,展示了从ServerBootstrap.bind()到最终的doBind0()方法的执行过程。
摘要由CSDN通过智能技术生成

Netty底层也是基于NIO,所以在分析服务启动的流程之前,我们先回顾一下NIO的启动Server的代码,写的一个Server例子如下,只保留和Netty启动相关的代码

public class NioServer implements Runnable {
   
    public static void main(String[] args) {
        new Thread(new NioServer(8080)).start();
    }
    private Selector selector;
    private ServerSocketChannel serverChannel;
    public NioServer(int port) {
        try {
            selector = Selector.open();
            serverChannel = ServerSocketChannel.open();
            serverChannel.socket().bind(new InetSocketAddress(port), 1024);
            serverChannel.configureBlocking(false);
            serverChannel.register(selector, SelectionKey.OP_ACCEPT);
        } catch (IOException e) {
        }
    }
    public void run() {
        //SelectionKey处理
    }
}

构造方法里先创建Selector和ServerSocketChannel,绑定端口和地址,然后Channel设置为非阻塞, 最后将该Channel注册到Selector上,一个简单的NIO初始化代码就是这样,Netty启动的时候核心也是这个代码,只不过Netty封装了(感觉有点复杂=_=)下面会看下Netty是怎么处理的

源码分析

首先看下NettyServer的Demo(本文基于netty4.1.22版本)

    public void bind(int port) {
        //配置服务端的NIO线程组
        EventLoopGroup bossGroup = new NioEventLoopGroup(1);
        EventLoopGroup workerGroup = new NioEventLoopGroup(4);

        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
                .channel(NioServerSocketChannel.class)
                .option(ChannelOption.SO_BACKLOG, 1024)
                .childHandler(new ChannelInitializer<SocketChannel>(){
                    @Override
                    protected void initChannel(SocketChannel socketChannel) throws Exception {
                        socketChannel.pipeline()
                            .addLast(new NettyServerHandler());
                    }
                });
            //绑定端口,同步等待成功
            ChannelFuture f = b.bind(port).sync();
            
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值