Netty是一个NIO客户端服务端框架与网络编程有什么关系?

Netty什么?Netty项目是一个提供异步事件驱动网络应用框架和快速开发可维护地高性能高扩展性服务端和客户端协议工具集的成果 。 换句话说 , Netty是一个NIO客户端服务端框架 , 它使得快速而简单的开发像服务端客户端协议的网络应用成为了可能 。 它它极大地简化并流线化了如TCP和UDP套接字服务器开发的网络编程 。 “快速且简便”不意味着目标应用将容忍维护性和性能上的问题 。 Netty在吸取了大量协议实现(如FTP , SMTP , HTTP以及各种二进制 , 基于文本的传统协议)的经验上进行了精心的设计 。 由此 , Netty成功找到了一个无需折衷妥协而让开发、性能、稳定性和灵活性相互协调的方法 。
1、回顾a) http协议是我们接触最多的 , 定义的API都是基于Http协议的 , Http协议属于应用层协议 。 传输层协议 , TCP / UDP协议 , TCP是通过三次握手 , 保障通信的可信 , 也就是我们常说的长连接 。 Netty是对TCP协议的封装 。
b) JAVA BIO / NIO / AIO
Java1.4版本引入NIO概念 , 实现了对“多路复用IO”的支持 , Java1.7版本引入AIO概念 。 AIO是最晚提出的 , 理应是更先进的技术 , 但是并没有大规模的在商业领域应用 。 Unix提供了五种参考网络模型 , 在linux领域 , 并没有异步IO网络模型的成熟方案(linux发行版内核不支持AIO , 需要自己安装扩展包) 。 JAVA的新版本的AIO , 还是用采用多路复用IO实现 。
2、Netty 编程基础现在从最简单的Echo程序入手 , 逐步深入地分享利用Netty如何编程 。
Netty Server Exemple
EventLoopGroup group = new NioEventLoopGroup();EventLoopGroup workGroup = new NioEventLoopGroup();try {ServerBootstrap b = new ServerBootstrap();b.group(group, workGroup).channel(NioServerSocketChannel.class).localAddress(new InetSocketAddress(port)).childHandler(new ChannelInitializer() {@Overridepublic void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast(new EchoServerHandler());}});ChannelFuture f = b.bind().sync();System.out.println(EchoServer.class.getName() + " started and listen on " + f.channel().localAddress());f.channel().closeFuture().sync();} finally {group.shutdownGracefully().sync();}Netty Server Handler Exemple
public class EchoServerHandler extends SimpleChannelInboundHandler {@Overridepublic void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) {ByteBuf in = (ByteBuf) msg;System.out.println("Server received: " + in.toString(CharsetUtil.UTF_8));ctx.write(Unpooled.copiedBuffer("Response from server. You have input \"" + in.toString(CharsetUtil.UTF_8) + "\"!", CharsetUtil.UTF_8));ctx.flush();}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {cause.printStackTrace();ctx.close();Netty Client Exemple
EventLoopGroup group = new NioEventLoopGroup(); try {Bootstrap b = new Bootstrap();b.group(group).channel(NioSocketChannel.class).remoteAddress(new InetSocketAddress(host, port)).handler(new ChannelInitializer() {@Overridepublic void initChannel(SocketChannel ch)throws Exception {ch.pipeline().addLast(new EchoClientHandler());}});ChannelFuture f = b.connect().sync();if (f.channel().isActive()) {f.channel().writeAndFlush(Unpooled.copiedBuffer("Hello Casper!", CharsetUtil.UTF_8));}Thread.sleep(1000); } finally {group.shutdownGracefully().sync();}Netty Client Handler Exemple
public class EchoClientHandler extends SimpleChannelInboundHandler {@Overridepublic void channelRead0(ChannelHandlerContext ctx, ByteBuf in) {System.out.println("Client received: " + in.toString(CharsetUtil.UTF_8));}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {cause.printStackTrace();ctx.close();} }3、BootStrap一个Netty程序开始于Bootstrap类 , Bootstrap类是Netty提供的一个可以通过简单配置来设置或"引导"程序的一个很重要的类 。 启动Sever端 , 需要初始化ServerBootStrap 。 定义两个EventLoopGroup , 分别处理连接请求和socket数据传输 。 Netty巧妙的把接收请求和处理请求 , 都抽象成ChannelHanndler处理 , 模式上更加统一 。 通过阅读代码 , 接收请求的处理如下:接到连接请求后 , 设置其初始化参数 , 然后注册到childGroup处理 。
【Netty是一个NIO客户端服务端框架与网络编程有什么关系?】void init(Channel channel) throws Exception {ChannelPipeline p = channel.pipeline();final EventLoopGroup currentChildGroup = this.childGroup;final ChannelHandler currentChildHandler = this.childHandler;p.addLast(new ChannelHandler[]{new ChannelInitializer() {public void initChannel(final Channel ch) throws Exception {final ChannelPipeline pipeline = ch.pipeline();ch.eventLoop().execute(new Runnable() {public void run() {pipeline.addLast(new ChannelHandler[]{new ServerBootstrap.ServerBootstrapAcceptor(ch, currentChildGroup, currentChildHandler, currentChildOptions, currentChildAttrs)});}});}}});}private static class ServerBootstrapAcceptor extends ChannelInboundHandlerAdapter {private final EventLoopGroup childGroup;private final ChannelHandler childHandler;ServerBootstrapAcceptor(final Channel channel, EventLoopGroup childGroup, ChannelHandler childHandler, Entry