Netty是Java的一种能提供异步事件驱动网络编程框架,Netty提供了简洁强大的API,能极大提升开发稳定可靠网络服务器和客户端程序的效率。java
以建立一个服务端举例说明编程
public class TimeServer { public void bind(int port) throws Exception { // 1.配置服务端的NIO线程组 EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); //2.配置参数 b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .option(ChannelOption.SO_BACKLOG, 1024) .childHandler(new ChildChannelHandler()); // 3.绑定端口,同步等待成功 ChannelFuture f = b.bind(port).sync(); //4. 等待服务端关闭 f.channel().closeFuture().sync(); } finally { //5.优雅退出,释放线程池资源 bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } } private class ChildChannelHandler extends ChannelInitializer<SocketChannel> { @Override protected void initChannel(SocketChannel arg0) throws Exception { arg0.pipeline().addLast(new TimeServerHandler()); } } /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { int port = 8080; if (args != null && args.length > 0) { try { port = Integer.valueOf(args[0]); } catch (NumberFormatException e) { // 采用默认值 } } new TimeServer().bind(port); } }
从上面的代码例子来看启动服务端有5个步骤服务器
Netty网络框架目前普遍的应用在各个领域中,那么为何不用Java原生的NIO来开发呢。具体缘由以下:网络
Netty的客户端就是单线程的NIO模型这里就不讨论,Netty的服务端的线程模型以下多线程
如上图AcceptorSelector线程的职责就是轮询客户端链接事件,若是轮询到客户端链接,将链接后的IO操做委托给IOSelector线程池操做。框架
Netty同时支持Reactor的单线程、多线程和主从多线程模型可经过配置线程个数和是否共享线程来实现。异步
Netty官方demo推荐使用主从多线程模型,试想若是IOSelector和AcceptorSelector使用同一个Selector来轮询,若是单个Selector处理大量的客户端的Acceptor和IO事件,出现某个操做很是损耗性能,将直接拖垮整个系统的Acceptor和IO事件处理能力。ide