JAVA基础之BIO,NIO开源框架Netty

一,TCP/UDP协议简介

1.OSI网络七成模型

  

各层的主要功能

2.TCP传输控制协议

TCP协议简介:

TCP握手机制

三次握手

四次挥手

3.UDP用户数据协议

TCP与UDP对比

Socket编程

基本API

二,BIO与NIO对比

2.1 BIO-阻塞IO的含义

BIO 是block(阻塞) IO的简称,由于主要涉及网络编程部分,所有主要介绍下BIO中的网络IO,也就是Socket编程。在JDK1.4之前的版本,建立网络连接只能采用BIO,其实目前也有很多系统依然采用这种的方式建立网络关系,目前公司的系统 也是采用这种方式。通过BIO建立网络连接,需要现在服务端启用一个ServerSocket来接收接收处理返回信息,在客户启用一个Socket来对服务端进行通信。在默认的情况下,客户端发送请求会先咨询服务端是否有线程响应,如果没有则会一直等待或者直接遭到拒绝,这就是阻塞IO。

非阻塞IO:
从JDK1.4开始,Java提供了一种的新的网络编程模式也就是NIO,全称是 java non-blocking IO,也就是非阻塞式IO,由于改进了一系列的输入/输出的新特性所以也称之为NEW IO。由于NIO的网络通道是非阻塞的NIO,基于事件驱动,非常适用于服务器需要为维持大量连接,但是数据量不大的情况,比如及时通讯等场景。NIO和BIO有着相同的目的和作用,但是实现方式却大不相同:

1、数据的处理方式:BIO是以流的形式处理数据,NIO是以块的形式的处理数据,块IO的处理效率要不比流IO高很多。2、BIO是阻塞式的,NIO是非阻塞式的,NIO可以提供非阻塞式的高伸缩性网络。

2.2 NIO简介

NIO有三大核心包括:Channel(通道),Buffer(缓冲区), Selector(选择器)。NIO 基于 Channel(通道)和 Buffer(缓冲区)进行操作,数据。总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择区)用于监听多个通道的事件(比如:连接请求,数据到达等),因此使用单个线程就可以监听多个客户端通道。

NIO三大核心组件:

 

2.2.1 Buffer缓冲区

Buffer(缓冲区):缓冲区就像一个数组,可以保存多个相同类型的数据。

工作原理

ByteBuffer内存类型

2.2.2 Channel通道

Channel:网络 IO 通道,具体负责进行读写操作。NIO 总是把缓冲区的数据写入通道,或者把通道里的数据读到缓冲区。

SocketChannel

ServerSocketChannel

2.2.3 Selector选择器

 Selector(选择器):能够检测多个注册的通道上是否有事件发生,如果有事件发生,便获取事件然后针对每个事件进行相应的处理。这样就可以只用一个单线程去管理多个通道,也就是管理多个连接。这样使得只有在连接真正有读写事件发生时,才会调用函数来进行读写,就大大地减少了系统开销,并且不必为每个连接都创建一个线程,不用去维护多个线程,并且避免了多线程之间的上下文切换导致的开销。

NIO集合多线程改进方法--Reactors线程模型

通过NIO实现Socket通讯的三种方式:

1、一个客户端连接用一个线程,优点:程序编写简单;缺点:如果连接非常多,分配的线程也会非常多,服务器可能会因为资源耗尽而崩溃。
 2、把每一个客户端连接交给一个拥有固定数量线程的连接池,优点:程序编写相对简单,可以处理大量的连接。确定:线程的开销非常大,连接如果非常多,排队现象会比较严重。

3、使用 Java 的 NIO,用非阻塞的 IO 方式处理。这种模式可以用一个线程,处理大量的客户端连接。

 

NIO与BIO对比

 

三,Netty框架

3.1 Netty简介及四个重要内容

Netty整体架构图

3.1.2 Netty线程模型

事件轮循器:EventLoopGroup初始化过程:这个EventLoop组,底层实际是创建了多个NioEventLoop,单个NioEventLoop里面内置的executor创建线程,来实现这么一个线程组,本质上就是Nio的Reactors线程,并且注册selector事件,执行时是通过轮循的方式处理事件和任务队列,每一个NioEventLoop对应的是一个线程。


 

Netty中Channel的概念

3.1.3 netty设计模式 - 责任链模式

责任链模式为请求创建了一个处理对象的链。发起请求和具体处理请求的过程进行解耦;每一个环节都负责处理自己指定的的责任即可,客户无需关心请求的细节和请求的传递。类似于汽车生产线,客户负责发起订单,其他都交给整个责任链生产线,有的handler负责打造外壳喷漆,接着是安装发动机,后面安装内饰,最后在安装车门等等,各自负责各自的事情。

责任链的实现模式需要有4个要素:1.处理器抽象类,2具体的处理器实现类,3保存处理器信息 ,4处理执行

附上一段伪代码:

实际中内部会有一个总的handler来维护整个handler责任链,内部包含所有各个handler责任点,整个链都是通过这个总的handler上下文去维护,通过最开始的handler的头和尾进行维护,一旦某个环节出问题都会通知到总的handler,他来判断是继续还是结束整个链。

事件的定义:

Pipeline责任链中的handler,及handler的维护

下面介绍Pipeline责任链的几种事件:

EventLoop在初始化的时候都有bind事件,bind事件分出站和入站这么两种,下面先来分析registered入站事件和出站事件的处理。

下面是EventLoop的accept入站事件和read入站事件

责任链设计模式的运用,保证了Netty的高度可扩展性

3.3.1 Netty自己封装的ByteBuffer

Netty中对Nio的Bytebuffer的,长度固定,不能动态扩展和收缩,以及当数据大于Bytebuffer容量时和API使用的复杂(读写的时候需要手工调用flip()和rewind()等方法,使用时候需要非常谨慎的使用这些api,否则容易出现错误),会发生索引越界异常的这些缺点进行了增强,主要增强了下面4个点:API操作便携性;动态扩容;多种Bytebuffer实现;高效的零拷贝机制;

Netty中对Bytebuffer的扩容默认值为256字节,最大值为2GB。

选择ByteBuffer的实现:Netty中使用的PooledUnsafeDirectByteBuf实现,但官方推荐个人使用 UnpooledHeapByteBuf这个实现类;Netty中实现了内存可复用。

零拷贝机制是指:逻辑上将将两个需要扩容的buffer进行了合并,不用通过复制来进行扩容,实现了零拷贝,不去动原数据。有一下3中实现。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值