Netty学习记录-入门篇

你如果 , 缓缓把手举起来 , 举到顶,再突然张开五指 , 那恭喜你,你刚刚给自己放了个烟花 。
模块介绍
  1. netty-bio: 阻塞型网络通信demo 。
  2. netty-nio: 引入channel(通道)、buffer(缓冲区)、selector(选择器)的概念,采用事件驱动的方式,使用单个线程就可以监听多个客户端通道 , 改进bio模式下线程阻塞等待造成的资源浪费
  3. netty-demo: Netty小demo,认识Netty初体验 。
  4. netty-groupchat: 使用Netty编写一个群聊系统 。
  5. netty-http: Netty的HTTP调用demo 。
  6. netty-bytebuf: Netty缓冲区使用demo 。
  7. netty-decoder: Netty编解码,handler调用链使用示例 。
  8. netty-idlestate: Netty心跳包使用示例 。
  9. netty-sticking: 自定义协议与handler,解决TCP传输粘包与拆包问题 。
  10. netty-rpc: 使用Netty自定义实现RPC通信 。
Demo地址:https://gitee.com/LHDAXIE/netty
netty-bio模块模拟测试采用socket的bio方式进行网络通信 。
blocking io同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器就需要启动一个线程进行处理,如果这个连接不做任何事情就会进入阻塞等待状态,造成不必要的线程开销 。
适用于连接数据小且连接固定的系统架构 。
架构示意图:
Netty学习记录-入门篇

文章插图
netty-nio模块non-blocking io同步非阻塞,在bio的架构上进行改进,引入channel(通道)、buffer(缓冲区)、selector(选择器)的概念,采用事件驱动的方式 , 使用单个线程就可以监听多个客户端通道,改进bio模式下线程阻塞等待造成的资源浪费 。
架构示意图:
Netty学习记录-入门篇

文章插图
关键:select会根据不同的事件,在各个channel通道上进行切换 。
缓冲区buffer本质上是一个可以读写数据(关键)的内存块,nio的读取与写入数据都必须是经过buffer的 。
通道channel把通道看做流、把通道看做流、把通道看做流 , 重要的事情说三遍,会很好理解 。nio引入的通道类似bio中流的概念,不同之处在于:
  • 通道可以同时进行读写操作,而流只能读或者写
  • 通道可以实现异步读写数据
  • 通道可以从缓冲区读数据,也可以写数据到缓冲区(双向的概念)
NIOFileOper01: 本地文件写数据使用ByteBufferFileChannel,将“hello,李嘉图”NIOFileOper01.txt文件中 。
NIOFileOper02: 本地文件读数据使用ByteBuffer(缓冲) 和 FileChannel(通道),将 NIOFileOper01.txt中的数据读入到程序,并显示在控制台屏幕
NIOFileOper03: 使用一个Buffer完成文件读取使用 FileChannel(通道) 和 方法 read , write,完成文件的拷贝
NIOFileCopy:拷贝文件 transferFrom 方法使用 FileChannel(通道) 和 方法 transferFrom ,完成文件的拷贝
选择器Selector核心:selector能够检测多个注册的通道上是否有事件发生(多个channel以事件的方式可以注册到同一个selector),如果有事件发生,便获取事件然后针对每个事件进行相应的处理 。这样就可以做到只使用一个单线程去管理多个通道 。
只有在连接/通道真正有读写事件发生时,才会进行读写,就大大地减少了系统开销 , 并且不必为每个连接都创建一个线程,不用去维护多个线程 。
原理图:
Netty学习记录-入门篇

文章插图
说明:
  1. 当客户端连接时,会通过ServerSocketChannel得到SocketChannel
  2. Selector进行监听select方法,返回有事件发生的通道的个数 。
  3. socketChannel注册到Selector上,register(),一个selector上可以注册多个SocketChannel
  4. 注册后返回一个selectionKey,会和该selector关联 。
  5. 进一步得到各个selectionKey(有事件发生) 。

    推荐阅读