星球狂想战队|深度解读Netty:NIO那些不为人知的秘密( 七 )


//Server端NioServer启动完成接受新的Channel服务端接收请求:你好服务端接收请求:你好服务端接收请求:你好//Client端[Thread-0]收到响应:收到[Thread-0]收到响应:收到[Thread-0]收到响应:收到四、总结回顾一下使用NIO开发服务端程序的步骤:
创建ServerSocketChannel和业务处理线程池 。 绑定监听端口 , 并配置为非阻塞模式 。 创建Selector , 将之前创建的ServerSocketChannel注册到Selector上 , 监听SelectionKey.OP_ACCEPT 。 循环执行Selector.select()``方法 , 轮询就绪的Channel` 。 轮询就绪的Channel时 , 如果是处于OP_ACCEPT状态 , 说明是新的客户端接入 , 调用ServerSocketChannel.accept接收新的客户端 。 设置新接入的SocketChannel为非阻塞模式 , 并注册到Selector上 , 监听OP_READ 。 如果轮询的Channel状态是OP_READ , 说明有新的就绪数据包需要读取 , 则构造ByteBuffer对象 , 读取数据 。那从这些步骤中基本知道开发者需要熟悉的知识点有:
jdk-nio提供的几个关键类:Selector,SocketChannel,ServerSocketChannel,FileChannel,ByteBuffer,SelectionKey需要知道网络知识:tcp粘包拆包、网络闪断、包体溢出及重复发送等需要知道linux底层实现 , 如何正确的关闭channel , 如何退出注销selector , 如何避免selector太过于频繁需要知道如何让client端获得server端的返回值,然后才返回给前端 , 需要如何等待或在怎样作熔断机制需要知道对象序列化 , 及序列化算法省略等等 , 因为我已经有点不舒服了 , 作为程序员的我习惯了舒舒服服简单的API , 不用太知道底层细节 , 就能写出比较健壮和没有Bug的代码...NIO原生API的弊端
①NIO组件复杂使用原生NIO开发服务器端与客户端,需要涉及到服务器套接字通道(ServerSocketChannel),套接字通道(SocketChannel),选择器(Selector),缓冲区(ByteBuffer)等组件,这些组件的原理和API都要熟悉,才能进行NIO的开发与调试,之后还需要针对应用进行调试优化
②NIO开发基础NIO门槛略高,需要开发者掌握多线程、网络编程等才能开发并且优化NIO网络通信的应用程序
③原生API开发网络通信模块的基本的传输处理网络传输不光是实现服务器端和客户端的数据传输功能,还要处理各种异常情况,如连接断开重连机制,网络堵塞处理,异常处理,粘包处理,拆包处理,缓存机制等方面的问题,这是所有成熟的网络应用程序都要具有的功能,否则只能说是入门级的Demo
④NIOBUGNIO本身存在一些BUG,如Epoll,导致选择器(Selector)空轮询,在JDK1.7中还没有解决
Netty在NIO的基础上,封装了Java原生的NIOAPI,解决了上述哪些问题呢?
相比JavaNIO , 使用Netty开发程序 , 都简化了哪些步骤呢?...等等这系列问题也都是我们要问的问题 。 不过因为这篇只是介绍NIO相关知识 , 没有介绍NettyAPI的使用 , 所以介绍NettyAPI使用简单开发门槛低等优点有点站不住脚 。 那么就留到后面跟大家一起开启Netty学习之旅 , 探讨人人说好的Netty到底是不是江湖传言的那么好 。


推荐阅读