东山明月

V1

2022/04/19阅读:17主题:蓝莹

2. netty服务端启动

netty服务端启动demo

本小节编写一个netty服务端启动的demo,初学者可从中看到netty基本使用方法,demo中各步骤详细注释。在此demo的基础之上分析netty的启动过程,之后的笔记将记录各启动过程的具体流程。

public final class Server {

    public static void main(String[] args) throws Exception {
        EventLoopGroup bossGroup = new NioEventLoopGroup(1); //对应 ch2中Server类start方法里的线程
        EventLoopGroup workerGroup = new NioEventLoopGroup(); // 闪电侠说是对应ch2中Client类中的线程,但是我认为是ClientHandler中具体处理逻辑的线程

        try {
            ServerBootstrap b = new ServerBootstrap(); //new的时候什么也不做
            b.group(bossGroup, workerGroup) //将两大线程配置进去
                    .channel(NioServerSocketChannel.class) //设置服务端socket channel
                    .childOption(ChannelOption.TCP_NODELAY, true) //为客户端的连接设置TCP的基本属性
                    .childAttr(AttributeKey.newInstance("childAttr"), "childAttrValue") //在每次创建客户端连接的时候可以绑定一些基本的属性
                    .handler(new ServerHandler()) //对应于ch2中ClientHandler中的逻辑,主要用来acctpt新用户的连接
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        public void initChannel(SocketChannel ch) { // 做数据的读写
                            ch.pipeline().addLast(new AuthHandler());
                            //..

                        }
                    });

            ChannelFuture f = b.bind(8888).sync();

            f.channel().closeFuture().sync();
        } finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
}

netty初始化过程

  • 创建服务端channel,调用jdk底层的api创建jdk的channel,之后netty将其包装成自己的channel,并创建一些基本组件绑定到该channel上。
  • 初始化服务端channel,创建完成之后会对channel做一些初始化的工作,比如初始化一些基本属性,添加一些逻辑处理器。
  • 注册selector,netty将jdk底层的channel注册到事件轮询器selector上面。
  • 端口绑定,调用jdk底层api实现对端口的监听。

带着问题去学习

  1. 服务端的socket在哪里初始化
  2. 在哪里accept连接

分类:

后端

标签:

Java

作者介绍

东山明月
V1