传统的java自带的socket每次建立连接都会建立一个新的线程。创建线程过分的浪费服务器系统资源。
jdk1.5前没有NIO时通过伪异步方式解决,用线程池解决问题。
IO和NIO的本质区别:阻塞和非阻塞的区别
阻塞:应用程序中获取网络数据的时候,如果网络传输数据很慢,那么程序就一直等着,直到传输完毕为止。
非阻塞:应用程序直接可以获取已经准备好的数据,无需等待。
BIO为同步阻塞形式,NIO为异步非阻塞形式。NIO并没有实现异步,中jdk1.7之后升级了NIO库包。
同步和异步:同步和异步一般是面向操作系统与应用程序对IO操作的层面上来区别的。
同步时,应用程序会直接参与IO操作,并且我们的应用程序会直接阻塞到某个方法上,直到数据准备就绪;或者采取轮询的策略实时检查数据的就绪状态,如果就绪则获取数据。
异步时,则所有的IO读写操作交给操作系统处理,与我们的应用程序没有直接关系,我们的程序不关心IO读写,当操作系统完成了IO读写操作时,会给我们应用程序发通知,我们的应用程序直接拿走数据即可。
同步说的是server服务器端端执行方式。
阻塞说的是具体技术,接受数据的方式、状态(IO,NIO)
AIO
Asynchronous Input/Output异步输入/输出是任何特殊输入/输出流
异步输入/输出是任何特殊输入/输出流(同步和异步输入/输出)两个基本操作模式之一。在异步模式中,自然的输入/输出事务不必须和一个程序的输入/输出状态同步或互锁。例如,一个用户或一个打字员应该被允许将信息提前输入系统中来执行能够使用它们的读状态。每个读状态的执行仅仅将下一个等待信息从一个输入缓冲器中去除。这个异步输入的例子类似于已经用于唱片、磁带等中的缓冲提前读方案。
Netty
netty实现通信:
1 创建两个NIO线程组,一个专门用于网络事件处理(接受客户端的连接),另一个则进行网络通信编写。
2 创建一个ServerBootstrap对象,配置netty的一系列参数,例如接受传出数据的缓存大小等等。
3 创建一个世纪处理数据的类ChannelInitializer,进行初始化的准备工作,比如设置接受传出数据的字符集、格式、已经实际处理数据的接口。
4 绑定端口,执行同步阻塞方法等待服务器端启动即可。
示例:http://ifeve.com/netty5-user-guide/