Netty实战入门详解——让你彻底记住什么是Netty

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

一、Netty 简介

Netty 是基于 Java NIO 的异步事件驱动的网络应用框架,使用 Netty 可以快速开发网络应用,Netty 提供了高层次的抽象来简化 TCP 和 UDP 服务器的编程,但是你仍然可以使用底层的 API。
Netty 的内部实现是很复杂的,但是 Netty 提供了简单易用的API从网络处理代码中解耦业务逻辑。Netty 是完全基于 NIO 实现的,所以整个 Netty 都是异步的。
Netty 是最流行的 NIO 框架,它已经得到成百上千的商业、商用项目验证,许多框架和开源组件的底层 rpc 都是使用的 Netty,如 Dubbo、Elasticsearch 等等。下面是官网给出的一些 Netty 的特性:
设计方面
1.对各种传输协议提供统一的 API(使用阻塞和非阻塞套接字时候使用的是同一个 API,只是需要设置的参数不一样)。
2.基于一个灵活、可扩展的事件模型来实现关注点清晰分离。
3.高度可定制的线程模型——单线程、一个或多个线程池。
4.真正的无数据报套接字(UDP)的支持(since 3.1)。
易用性
1.完善的 Javadoc 文档和示例代码。
2.不需要额外的依赖,JDK 5 (Netty 3.x) 或者 JDK 6 (Netty 4.x) 已经足够。
性能
1.更好的吞吐量,更低的等待延迟。
2.更少的资源消耗。
3.最小化不必要的内存拷贝。
安全性
1.完整的 SSL/TLS 和 StartTLS 支持
对于初学者,上面的特性我们在脑中有个简单了解和印象即可, 下面开始我们的实战部分。

二、一个简单 Http 服务器

开始前说明下我这里使用的开发环境是 IDEA+Gradle+Netty4,当然你使用 Eclipse 和 Maven 都是可以的,然后在 Gradle 的 build 文件中添加依赖 compile ‘io.netty:netty-all:4.1.26.Final’,这样就可以编写我们的 Netty 程序了,正如在前面介绍 Netty 特性中提到的,Netty 不需要额外的依赖。
第一个示例我们使用 Netty 编写一个 Http 服务器的程序,启动服务我们在浏览器输入网址来访问我们的服务,便会得到服务端的响应。功能很简单,下面我们看看具体怎么做?
首先编写服务启动类

public class HttpServer {
   
   
    public static void main(String[] args) {
   
   
        //构造两个线程组
        EventLoopGroup bossrGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
   
   
            //服务端启动辅助类
            ServerBootstrap bootstrap = new ServerBootstrap();
             bootstrap.group(bossGroup, workerGroup)
            .channel(NioServerSocketChannel.class)
            .childHandler(new HttpServerInitializer());
             ChannelFuture future = bootstrap.bind(8080).sync();
            //等待服务端口关闭            future.channel().closeFuture().sync();
        } catch (InterruptedException e) {
   
   
            e.printStackTrace();
        }finally {
   
   
            // 优雅退出,释放线程池资源
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
}

在编写 Netty 程序时,一开始都会生成 NioEventLoopGroup 的两个实例,分别是 bossGroup 和 workerGroup,也可以称为 parentGroup 和 childGroup,为什么创建这两个实例,作用是什么?可以这么理解,bossGroup 和 workerGroup 是两个线程池, 它们默认线程数为 CPU 核心数乘以 2,bossGroup 用于接收客户端传过来的请求,接收到请求后将后续操作交由 workerGroup 处理。
接下来我们生成了一个服务启动辅助类的实例 bootstrap,boostrap 用来为 Netty 程序的启动组装配置一些必须要组件,例如上面的创建的两个线程组。channel 方法用于指定服务器端监听套接字通道 NioServerSocketChannel,其内部管理了一个 Java NIO 中的ServerSocketChannel实例。
channelHandler 方法用于设置业务职责链,责任链是我们下面要编写的,责任链具体是什么,它其实就是由一个个的 ChannelHandler 串联而成,形成的链式结构。正是这一个个的 ChannelHandler 帮我们完成了要处理的事情。
接着我们调用了 bootstrap 的 bind 方法将服务绑定到 8080 端口上,bind 方法内部会执行端口绑定等一系列操,使得前面的配置都各就各位各司其职,sync 方法用于阻塞当前 Thread,一直到端口绑定操作完成。接下来一句是应用程序将会阻塞等待直到服务器的 Channel 关闭。
启动类的编写大体就是这样了,下面要编写的就是上面提到的责任链了。如何构建一个链,在 Netty 中很简单,不需要我们做太多,代码如下:

public class HttpServerInitializer extends ChannelInitializer<SocketChannel> {
   
   
    protected void initChannel(SocketChannel sc) throws Exception {
   
   
        ChannelPipeline pipeline = sc.pipeline();
        //处理http消息的编解码
        pipeline.addLast("httpServerCodec", new HttpServerCodec());
        //添加自定义的ChannelHandler
        pipeline.addLast("httpServerHandler", new HttpServerHandler());
    }
}

我们自定义一个类 HttpServerInitializer 继承 ChannelInitializer 并实现其中的 initChannel方法。
ChannelInitializer 继承 ChannelInboundHandlerAdapter,用于初始化 Channel 的 ChannelPipeline。通过 initChannel 方法参数 sc 得到 ChannelPipeline 的一个实例。
当一个新的连接被接受时, 一个新的 Channel 将被创建,同时它会被自动地分配到它专属的 ChannelPipeline。
ChannelPipeline 提供了 ChannelHandler 链的容器,推荐读者仔细自己看看 ChannelPipeline 的 Javadoc,文章后面也会继续说明 ChannelPipeline 的内容。
Netty 是一个高性能网络通信框架,同时它也是比较底层的框架,想要 Netty 支持 Http(超文本传输协议),必须要给它提供相应的编解码器。
所以我们这里使用 Netty 自带的 Http 编解码组件 HttpServerCodec 对通信数据进行编解码,HttpServerCodec 是 HttpRequestDecoder 和 HttpResponseEncoder 的组合,因为在处理 Http 请求时这两个类是经常使用的,所以 Netty 直接将他们合并在一起更加方便使用。所以对于上面的代码:

pipeline.addLast("httpServerCodec", new HttpServerCodec())

我们替换成如下两行也是可以的。

pipeline.addLast("httpResponseEndcoder", new HttpResponseEncoder());
pipeline.addLast("HttpRequestDecoder", new HttpRequestDecoder());

通过 addLast 方法将一个一个的 ChannelHandler 添加到责任链上并给它们取个名称(不取也可以,Netty 会给它个默认名称),这样就形成了链式结构。在请求进来或者响应出去时都会经过链上这些 ChannelHandler 的处理。
最后再向链上加入我们自定义的 ChannelHandler 组件,处理自定义的业务逻辑。下面就是我们自定义的 ChannelHandler。

public class HttpServerChannelHandler0 extends
 SimpleChannelInboundHandler<HttpObject> 
搭建简单的Netty开发环境 今天准备学学声明显赫的Netty框架,自然要先学会怎么搭建一个简单的Netty开发环境啦。话不多说,下面进入正文。 编辑器方面自然是推荐IntelJ idea了,idea的强大不必多说,百度一下你就知道。哈哈 下面就是准备Netty的jar包了,如果你会maven的话自然是使用maven最为方便了。只需要在pom文件中导入以下几行 &lt;!-- https://mvnrepository... 阅读详情

相关推荐

Netty(二)

Netty一、Netty概述1.1 原生NIO存在的问题1.2 Netty官网说明 一、Netty概述 1.1 原生NIO存在的问题 NIO 的类库和 API 繁杂,使用麻烦:需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等。 需要具备其他的额外技能:要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor模式,你必须对多线程 和网络编程非常熟悉,才能编写出高质量的 NIO 程序。 开发工作量和难度都非常大:例如客户

残影的博客 1379

什么是netty--通俗易懂

一.Netty介绍 1.什么是netty Netty是由JBOSS提供的一个Java开源框架。Netty提供异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络IO程序,是目前最流行的NIO框架,Netty在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,知名的Elasticsearch、Dubbo框架内部都采用了Netty。 2.为什么要用netty 原生NIO存在问题: 1.NIO的类库和API繁杂 2.需...

lisheng19870305的专栏 1万+

Netty-基础入门

Netty是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端。

Java就是我的道! 7806

Netty详解

Netty是一个高性能、异步的网络应用框架,用于开发高效的网络通信程序。它是JavaNIO的一个抽象,简化了网络编程的复杂性,并提供了一系列高级功能,使网络编程变得更简单。Netty是一个高效的网络框架,专注于处理大量并发连接。它通过异步IO处理来避免阻塞,这让它在处理高并发时表现出色。Netty还利用了优化的内存管理和零拷贝技术,降低了性能开销。框架的灵活性也很高,开发者可以通过管道机制自定义数据处理流程,API和文档丰富,帮助简化网络编程。不过,Netty

努力分享一些干货 5524

Netty实战入门详解——让你彻底记住什么是Netty(看不懂你来找我)

Netty 是基于 Java NIO 的异步事件驱动的网络应用框架,使用 Netty 可以快速开发网络应用,Netty 提供了高层次的抽象来简化 TCP 和 UDP 服务器的编程,但是你仍然可以使用底层的 API。Netty 的内部实现是很复杂的,但是 Netty 提供了简单易用的API从网络处理代码中解耦业务逻辑。Netty 是完全基于 NIO 实现的,所以整个 Netty 都是异步的。

qq_48811377的博客 4152

【网络编程】Netty实战入门详解

分享学习: Netty实战入门详解——让你彻底记住什么是Netty(看不懂你来找我)

marry44750的博客 360

Netty是基于NIO实现的?Netty都是异步的?彻底记住什么是Netty

一、Netty 简介 Netty 是基于 Java NIO 的异步事件驱动的网络应用框架,使用 Netty 可以快速开发网络应用,Netty 提供了高层次的抽象来简化 TCP 和 UDP 服务器的编程,但是你仍然可以使用底层的 API。 Netty 的内部实现是很复杂的,但是 Netty 提供了简单易用的API从网络处理代码中解耦业务逻辑。Netty 是完全基于 NIO 实现的,所以整个 Netty 都是异步的。 Netty 是最流行的 NIO 框架,它已经得到成百上千的商业、商用项目验证,许多框架和

+W❤:bjmsb2019 2015

我已经写的很详细了,让你彻底记住什么是Netty(看不懂你来找我)

Netty 是基于 Java NIO 的异步事件驱动的网络应用框架,使用 Netty 可以快速开发网络应用,Netty 提供了高层次的抽象来简化 TCP 和 UDP 服务器的编程,但是你仍然可以使用底层的 API。 ​

xiaojieceo的博客 1177

Netty 入门实战:从零搭建 Discard、Echo 和 Time 服务器

Netty是一个异步事件驱动的网络应用框架,用于快速开发高性能、可扩展的协议服务器和客户端。文章通过三个示例演示Netty基础用法:Discard服务器(丢弃数据)、Echo服务器(回显数据)和Time服务器(主动发送时间后关闭连接),展示了Netty的核心概念如ChannelHandler、ByteBuf管理和异步操作。这些示例为学习Netty网络编程打下基础,后续可深入编解码器、性能调优等高级主题。Netty简化了网络编程,同时保证了性能和稳定性。

ywl470812087的博客 15万+

netty 关闭连接_netty快速入门

什么是nettyNetty 是一个提供 asynchronous event-driven (异步事件驱动)的网络应用框架,是一个用以快速开发高性能、高可靠性协议的服务器和客户端。换句话说,Netty 是一个 NIO 客户端服务器框架,使用它可以快速简单地开发网络应用程序,比如服务器和客户端的协议。Netty 大大简化了网络程序的开发过程比如 TCP 和 UDP 的 socket 服务的开发。"快...

weixin_39639568的博客 2374

Netty入门到精通:高性能网络编程的进阶之路

Netty是一个基于NIO的客户、服务器端编程框架,使用Netty可以确保你快速和易于开发高性能、高可靠性的网络服务器和客户端程序。Netty是一个强大而复杂的框架,从入门到精通需要不断的学习和实践。希望本文能为你的Netty学习之旅提供一个清晰的路线图。记住,真正的精通来自于在实际项目中的应用和不断的探索。让我们一起在Netty的世界中不断进步,构建更加高效、可靠的网络应用!

进击的码农 1482

Netty是什么详解,带案例!(秒懂Netty是什么以及和普通IO的区别)

很多人都不知道Netty是什么,以及跟普通的IO有什么区别,这篇文章就以大白话快速讲解什么是Netty,它是干嘛的。

javaeEEse的博客 760

Netty入门

netty是什么? 官方那个给出的介绍是:Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。 然后我们简单理解一下,netty是封装java socket noi的。 类似的功能是 apache的mina。 相对于Tomcat这种Web Server(顾名思义主要是提供Web协议相...

有的话没说出来之前,你是他的主人,一旦说出来你就成了他的奴隶||想要干好事,别太把自己当人,别把别人太不当人||认识这个人就是开了一扇窗户,就能看到不一样的东西,听到不一样的声音,能让你思考、觉悟,这已经够了 246

netty快速入门

什么是netty Netty 是一个提供 asynchronous event-driven (异步事件驱动)的网络应用框架,是一个用以快速开发高性能、高可靠性协议的服务器和客户端。换句话说,Netty 是一个 NIO 客户端服务器框架,使用它可以快速简单地开发网络应用程序,比如服务器和客户端的协议。Netty 大大简化了网络程序的开发过程比如 TCP 和 UDP 的 socket 服务的开发。...

黑马程序员官方博客 473
上一篇: 【分布式】缓存穿透、缓存雪崩,缓存击穿解决方案
下一篇: java实现socket连接方法封装详解
lemonmini
博客等级 码龄8年 15粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值