1.BIO(阻塞IO)
- 每来一个请求(socket),就分配一个新的线程去处理I/O,[获取请求和获取请求中的消息时都是阻塞的]

2.NIO(同步非阻塞IO)
- 单个线程,通过记录跟踪每个I/O流(socket)的状态,来同时管理多个I/O流(linux通过三种方式来实现)[获取请求和获取请求中的消息时都不是阻塞的(通过while循环来获取,如果获取不到就返回null)]

· select: java程序将所有的socket进程传给linux,操作系统根据所有socket的fd(文件描述符,Linux一切皆文件)获取每个socket的状态,如果有消息传来,就返回java程序,但是java创徐不知道是哪g个socket来的消息,只能遍历socket(而且select最大只能监听1024个scoket)
· poll:在select的基础上,不在有1024的限制了(因为内部从数组改为链表了)
· epoll:内部维护了一棵红黑树(增删查很高效),linux接收到socket之后会使用epoll_create()创建一个epoll对象,然后使用epoll_ctl()把epoll对象加入红黑树中,如果epoll对象触发事件,就把这个事件和一些额外信息组装起来放入一个链表内,java程序来获取socket的请求时,把链表内的消息返回给java程序
更详细的:
https://blog.csdn.net/XueyinGuo/article/details/113096163