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
- 对手|一加9Pro全面曝光,或是小米11最大对手
- 行业|现在行业内客服托管费用是怎么算的
- 王兴称美团优选目前重点是建设核心能力;苏宁旗下云网万店融资60亿元;阿里小米拟增资居然之家|8点1氪 | 美团
- 手机基带|为了5G降低4G网速?中国移动回应来了:罪魁祸首不是运营商
- 技术|做“视频”绿厂是专业的,这项技术获人民日报评论点赞
- 互联网|苏宁跳出“零售商”重组互联网平台业务 融资60亿只是第一步
- 车企|华为不造车!但任正非加了一个有效期,3年
- 体验|闭上眼睛点外卖是什么感觉?时隔一年再次体验,进步令人欣慰
- 同轴心配合|用SolidWorks画一个直角传动,画四个零件就行
- 先别|用了周冬雨的照片,我会成为下一个被告?自媒体创作者先别自乱阵脚