网络IO——BIO、NIO

IO基本概念

在这里插入图片描述
在这里插入图片描述
学习整理源自:https://blog.csdn.net/vtopqx/article/details/88115899

总结

在这里插入图片描述

Netty

利用Java高级网络能力,隐藏其背后的复杂性而提供的一个易于使用的API,是一个C-S框架。
Tomcat时基于Http协议的,实质是一个基于http协议的容器;
netty能通过编程自定义各种协议——可以通过codec自己编码/解码字节流,完成类似redis访问的功能。
Netty受到大公司的青睐,因为其具备以下三个特点:高并发、传输快、封装好

Netty高并发

它是一款基于NIO开发的网络通信框架,相对于BIO,NIO一个线程可以处理多个socket连接,因此在有限线程资源的前提下,NIO可以提供更高的并发连接及处理能力。
下图可以看出,BIO中一个线程只能处理一个socket(其读写都是被阻塞的)。而在NIO中,引入了selector,当socket建立之后,线程不会阻塞去接收某个socket的消息,而是交给selector,selector不断轮询,一旦有socket触发了IO事件,它就会通知到线程对数据进行处理。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

Netty传输快

以来了NIO的零拷贝特性。一般的,数据如果从IO读取到内存,需要经过socket缓冲区,也就是需要经过两次拷贝才能到达内存。如果数据量大会造成不必要的资源浪费。Netty在接收数据时,会在堆内存之外开辟一块内存,数据直接从IO读取到这块内存中,在netty里通过ByteBuffer可以直接读取这些数据,加快了传输速度。
在这里插入图片描述

Netty封装好

Netty将Socket相关的细节操作做了封装,比直接使用Java的NIO接口要有好的多。

Netty中的概念

Channel:数据传输流。
Channel表示一个连接,每个请求就是一个channel;
ChannelHandler,核心处理业务,用于处理业务请求;
ChannelHandlerContext,用于传输业务数据;
ChannelPipeline,用于保存处理过程中需要用到的channelHandler和ChannelHandlerContext。
在这里插入图片描述
ByteBuffer,一个存储字节的容器,既有自己的读写索引,方便对整段字节缓存读写,也支持get/set,方便对其中每个字节进行读写。
有三种使用模式:
Heap Buffer堆缓冲区:最常用的模式,将数据存储在堆空间;
Direct Buffer直接缓冲区:内存分配不发生在堆上,jdk1.4引入的NIO允许jvm调用本地方法分配内存;
Composite Buffer复合缓冲区:相当于多个不同的Buffer视图,是Netty提供的,Jdk具备这种功能。

Codec,Netty中的编码、解码器,可以完成字节与POJO、POJO与POJO的相互转换,从而达到自定义协议的目的。如HttpRequestDecoder和HttpResponseEncoder。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值