该文章是Netty相关文章。目的是让读者能够快速的了解netty的相关知识以及开发方法。因此本文章在正式介绍Netty开发前先介绍了Netty的前置相关内容:线程模型,JavaNIO,零拷贝等。本文章以大纲框架的形式整体介绍了Netty,希望对读者有些帮助。文中图片多来自于百度网络,如果有侵权,可以联系我进行删除。内容若有不当欢迎在评论区指出。
Netty
netty是由JBOSS提供的一个Java开源框架,是一个异步的,基于事件驱动的网络应用框架,用以快速开发高性能,高可靠性的网络IO程序.
NIO模型
- 阻塞IO:发起请求就一直等待,直到数据返回。在IO执行的两个阶段都被block了
- 非阻塞IO:应用程序不断在一个循环里调用recvfrom,轮询内核,看是否准备好了数据,比较浪费CPU
- io复用:一个或一组线程处理多个连接可以同时对多个读/写操作的IO函数进行轮询检测,直到有数据可读或可写时,才真正调用IO操作函数
- 信号驱动IO:事先发出一个请求,当有数据后会返回一个标识回调,然后通过recvfrmo去请求数据
- 异步io:发出请求就返回,剩下的事情会异步自动完成,不需要做任何处理
异步 I/O 与信号驱动 I/O 的区别在于,异步 I/O 的信号是通知应用进程 I/O 完成,而信号驱动 I/O 的信号是通知应用进程可以开始 I/O。
Java NIO
- 三大核心Channel(通道),Buffer(缓冲区),Selector(选择器)。数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中,Selector用于监听多个通道的事件。
- Channel:是双向的,既可以用来进行读操作,又可以用来进行写操作
FileChannel 文件IO,不支持非阻塞模式,无法同Selector一同使用
DatagramChannel UDP
SocketChannel TCP
ServerSocketChannel TCP
Buffer:它通过几个变量来保存这个数据的当前位置状态:
capacity:缓冲区数组的总长度
position:下一个要操作的数据元素的位置
limit:缓冲区数组中不可操作的下一个元素的位置
- 向Buffer中写数据:
从Channel写到Buffer (fileChannel.read(buf))
通过Buffer的put()方法 (buf.put(…))
从Buffer中读取数据:
从Buffer读取到Channel (channel.write(buf))
使用get()方法从Buffer中读取数据 (buf.get())
- flip():写模式下调用flip()之后,Buffer从写模式变成读模式。limit设置为position,position将被设回0
clear()方法:position将被设回0,limit设置成capacity,Buffer被清空了,但Buffer中的数据并未被清除。
compact():将所有未读的数据拷贝到Buffer起始处。然后将position设到最后一个未读元素正后面,limit设置成capacity,准备继续写入。读模式变成写模式
Buffer.rewind()方法将position设回0,所以你可以重读Buffer中的所有数据
- Selector:Selector一起使用时,Channel必须处于非阻塞模式下。通过channel.register,将channel登