TCP与UDP区别总结:
简单点理解就是:
BIO:同步并阻塞 ,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动
一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改
善。BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应
用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
NIO:同步非阻塞 ,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复
用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。NIO方式适用于连接数目多且连
接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
AIO:异步非阻塞 ,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通
知服务器应用去启动线程进行处理.AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相
册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。
NIO有什么缺点:
NIO的类库和API还是有点复杂,比如Buffer的使用 Selector编写复杂,如果对某个事件注册后,业务
代码过于耦合 需要了解很多多线程的知识,熟悉网络编程 面对断连重连、保丢失、粘包等,处理复杂
NIO存在BUG,根据网上言论说是selector空轮训导致CPU飙升,具体有兴趣的可以看看JDK的官网
Netty主要的优点有:
框架设计优雅,底层模型随意切换适应不同的网络协议要求
提供很多标准的协议、安全、编码解码的支持
解决了很多NIO不易用的问题
在很多开源框架中使用,如Dubbo、RocketMQ、Spark等
底层核心有:Zero-Copy-Capable Buffer,非常易用的灵拷贝Buffer(这个内容很有意思,稍后
专门来说);统一的API;标准可扩展的时间模型
传输方面的支持有:管道通信(具体不知道干啥的,还请老司机指教);Http隧道;TCP与UDP
协议方面的支持有:基于原始文本和二进制的协议;解压缩;大文件传输;流媒体传输;
protobuf编解码;安全认证;http和websocket
总之提供了很多现成的功能可以直接供开发者使用。~~~~
对于粘包和拆包问题,常见的解决方案有四种:
单Reactor单线程
只有一个select循环接收请求,客户端(client)注册进来由Reactor接收注册事件,
然后再由reactor分发(dispatch)出去,由下面的处理器(Handler)去处理。
单Reactor多线程
在多线程Reactor中,注册接收事件都是由Reactor来做,其它的计算,编解码由一个线程池
来做。从图中可以看出工作线程是多线程,监听注册事件的Reactor还是单线程。
多Reactor多线程
mainReactor负责监听客户端请求,专门处理新连接的建立,将建立好的连接注册到subReactor。
subReactor将分配的连接加入到队列进行监听,当有新的事件发生时,会调用连接相
对应的Handler进行处理。
户端请求,专门处理新连接的建立,将建立好的连接注册到subReactor。
subReactor将分配的连接加入到队列进行监听,当有新的事件发生时,会调用连接相
对应的Handler进行处理。
下一篇:Vue开发技巧总结