简单使用示例
服务端
//EchoServerHandler是自己继承ChannelInboundHandlerAdapter重写的类
final EchoServerHandler serverHandler = new EchoServerHandler();
//创建EventLoopGroup
EventLoopGroup group = new NioEventLoopGroup();
try {
//创建ServerBootstrap
ServerBootstrap b = new ServerBootstrap();
b.group(group)
//适用于NIO传输的Channel类型
.channel(NioServerSocketChannel.class)
//使用指定的端口设置套接字地址
.localAddress(new InetSocketAddress(port))
//添加一个EchoServerHandler到子Channel的ChannelPipeline
.childHandler(new ChannelInitializer<SocketChannel>() {
protected void initChannel(SocketChannel socketChannel) throws Exception {
socketChannel.pipeline().addLast(serverHandler);
}
});
//异步绑定服务器,调用sync()方法阻塞等待直到绑定完成
ChannelFuture f = b.bind().sync();
//获取Channel的CloseFuture,并且阻塞当前线程直到它完成
f.channel().closeFuture().sync();
}finally {
//关闭EventLoopGroup,释放所有的资源
group.shutdownGracefully().sync();
}
Bootstrap
netty应用程序通过设置bootstrap(引导)类开始,该类提供了一个用于网络成配置的容器。
- 一种是用于客户端的Bootstrap
- 一种是用于服务端的ServerBootstrap
Channel
netty中的channel定义了丰富的和socket交互的操作方法:bind、close、config、connect、isActive、isOpen、isWriteable、read、write等等,降低直接使用Socket类的复杂性。Netty提供大量的Channel实现来针对不同方式的处理、这些包括AbstraChannel、AbstractNioByteChannel、AbstractNioChannel、EmbeddedChannel、LocalServerChannel、NioSocketChannel等等
ChannelHandler
用户处理入站和出站的数据。常用的一个接口是ChannelInboundHandler,这个类型接收到入站事件(包括接收到的数据)可以处理应用程序逻辑。当你需要提供响应时,你也可以从ChannelInboundHandler冲刷数据。一句话,业务逻辑经常存活于一个或者多个ChannelInboundHandler
ChannelPipeline
ChannelPipline提供了ChannelHandler链的容器,并定义了用于该链上传播入站和出站事件流的API。当Channel被创建时,它会被自动地分配到它专属的ChannelPipeline。
ChannelFuture
用于监听Netty的处理结果,并根据结果进行后续处理。异步通知。
EventLoop
EventLoop用于处理连接的生命周期中所发生的事件,控制流、多线程处理、并发。
- 一个EventLoopGroup包含一个或者多个EventLoop
- 一个EventLoop在它的生命周期内只和一个Thread绑定
- 所有由EventLoop处理的I/O事件都将在它专有的Thread上被处理
- 一个Channel在它的生命周期内只注册于一个EventLoop
- 一个EventLoop可能会分配给一个或多个Channel