1. 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();
}
}
}
2. netty初始化过程
- 创建服务端channel,调用jdk底层的api创建jdk的channel,之后netty将其包装成自己的channel,并创建一些基本组件绑定到该channel上。
- 初始化服务端channel,创建完成之后会对channel做一些初始化的工作,比如初始化一些基本属性,添加一些逻辑处理器。
- 注册selector,netty将jdk底层的channel注册到事件轮询器selector上面。
- 端口绑定,调用jdk底层api实现对端口的监听。
3. 带着问题去学习
- 服务端的socket在哪里初始化
- 在哪里accept连接