什么是Netty?
Netty是一款受大公司青睐的java开源网络编程框架,用以快速开发高性能、高可靠性的网络服务程序。
为什么不叫Http服务程序?
Netty可以通过编程自定义各种协议,当然也可以作为Http服务。
BIO和NIO分别是什么意思?
BIO(Blocking I/O),阻塞IO,资源不可用时,IO请求一直阻塞,阻塞导致处理网络I/O时,一个线程只能处理一个网络连接。
NIO(Non-Blockiing I/O),非阻塞IO,资源不可用时,非阻塞IO就立即通行,不会阻塞,线程可以继续执行其他任务,等到资源可用的时候再去读取。
为什么Netty会受到大公司的青睐?
虽然说,非阻塞IO比阻塞IO有更高的性能,但是对于开发来的,难度就成数倍递增了。由于是有多少数据就读取多少数据,这样在读取完整之前需要将已经读取到的数据保存起来,而且需要与其他地方来的数据隔离开来不能混在一起,否则就不知道这数据是谁的了。
但是,Netty隐藏其背后的复杂性而提供一个易于使用的 API 的客户端 / 服务器框架。Netty作为业界最流行的NIO框架之一,它的健壮性、功能、性能、可定制性、可扩展性都是首屈一指的。以下是Netty的优点:
1、API 使用简单,开发门槛低;
2、性能高,通过与其它业界主流的 NIO 框架对比,Netty 的综合性能最优;
3、预置了多种编解码功能,支持多种主流协议;
4、定制能力强,通过channelHandler对通信框架进行灵活扩展;
5、稳定,修复了Java 原生NIO出现的所有Bug;
6、社区活跃,版本迭代周期短,发现的 BUG 可以被及时修复,同时,更多的新功能会被加入;
7、经历了大规模的商业应用考验,质量得到验证。在互联网、大数据、网络游戏、企业应用、电信软件等众多行业得到成功商用,证明了它完全满足不同行业的商用标准;
下面举一个由Netty搭建的一个下载文件的服务程序
一、添加依赖
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.42.Final</version>
</dependency>
二、新建一个ServerBootstrap对象,并设置fileServerHandler
public class HttpServer {
public static void run(final int port, final String url) {
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) {
// 加入http的解码器
ch.pipeline().addLast("http-decoder", new HttpRequestDecoder());
// 加入ObjectAggregator解码器,作用是他会把多个消息转换为单一的FullHttpRequest或者FullHttpResponse
ch.pipeline().addLast("http-aggregator", new HttpObjectAggregator(65536));
// 加入http的编码器
ch.pipeline().addLast("http-encoder", new HttpResponseEncoder());
// 加入chunked 主要作用是支持异步发送的码流(大文件传输),但不专用过多的内存,防止java内存溢出