网络编程,主要就是BIO,NIO,AIO编程了,首先要了解各个编程的意思,以及编码复杂度,才能最终去选择,如何使用。
BIO: 同步阻塞式IO,比较直观地就是我们java基础网络编程用的java.net.ServerSocket和java.net.Socket,这种方式是阻塞式的,客户端向服务端发起连接,就会一直等待响应,直到拿到请求数据,或者出现异常,而服务端则监听端口,然后等待客户端连接,这种方式是一对一的,一个服务端线程只能对应一个客户端线程。所以当并发量较大时,就会占用大量的线程资源,最后连接的都会阻塞等待,以至于最后应用无法提供服务。而优化方案则是,服务端在处理客户端连接时,通过线程池的方式,可以很大程度上提高效率。
NIO: 同步非阻塞式IO,又叫new IO,或者non-blocking io(非阻塞式IO)。和ServerSocket和Socket相比,NIO也提供了ServerSocketChannel和SocketChannel。NIO主要包括三大块:Buffer(缓冲区)、Channel(通道)、Selector(多路复用器)。
1)Buffer
在NIO类库中所有操作都是通过Buffer的,最长用的是ByteBuffer,还有其他的一些基本类型的Buffer,每个Buffer类都有完全一样的操作,只是所处理的数据类型不一样。基本属性有:
capacity:容量,缓冲区最大值,Buffer创建时设置。
limit:缓冲区当前已使用的大小。
position:缓冲区指针位置,也就是缓冲区下一次要都写的位置,每次都会被重新设置。
mark:标记,mark()方法和reset方法都会操作该值,默认是-1。
2)Channel
通道即用来传输读写数据,是双向的,可以读,可以写,也可以同时读写。通道可以分为两大类:用于网络读写的SelectableChannel和用于文件操作的FileChannel,类图如下图
3)selector
多路复用器,Selector会不断轮询注册在其上的Channel,如果某个通道上有新的TCP连接,读或者写事件,Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey可以获取Channel集合,进行IO操作。
AIO(NIO2)
jdk1.7才有的,属于异步非阻塞IO。读和写操作均是异步,应用程序发起读或写操作,然后做自己事情,操作系统完成读写后通知应用程序,其中的read/write方法,会返回一个带回调函数的对象,当执行完读取/写入操作后,直接调用回调函数,它不需要对注册通道进行轮询即可实现异步读写。
性能比较:
本文参考netty权威指南