NETTY (一)了解NIO
NETTY 是基于JAVA NIO开发的框架
IO 流
Input(输入流)Ouput(输出流)
NIO (NON-Blocking IO)
是一种同步非阻塞的I/O模型、解决高并发与大量连接、I/O处理问题的有效方式。
这就要了解一下什么是阻塞和非阻塞 异步和同步
阻塞和非阻塞是和接受数据这一方关联的
同步和异步是和发送数据这一方关联的
1、阻塞 I/O (BIO)
客户端连接服务端:
服务端通过 while(true) serverSocket.accept() 方法接受请求且会阻塞、就是不能往下在执行了、必须要用连接请求才能继续执行。
当有连接请求执行完成、开启子线程进行读写操作。如果不开启线程就会阻塞(read和write都会阻塞)、必须要等执行完read和write才能接受新的连接请求。
即:Socket服务端要实现同时接受多个连接请求、就需要使用多线程。
这种情况下就会出现、如果没有IO流的请求、这个线程就什么是也没做。(当然短连接时可以使用线程池来优化、长连接的话 用线程池也没用、因为线程需要一直开启接受数据)
(一个连接一个线程)开启一个线程进行对客户端的IO流请求进行读写、才能接受别的连接请求
2、非阻塞 I/O (NIO 代表 IO多路复用)
客户端连接服务端:
服务端开一个线程使用Selector处理所有的连接,并且轮询处理所有连接的IO流请求。
即:Socket服务端通过一个叫Selector(多路复用器)、在一个线程中调用Selector、实现处理多个客户端连接请求和IO流请求、这个就叫做NIO线程。
(一个IO流请求一个线程)当连接有 IO流 请求时、开启一个线程处理该读写请求。
3、同步
客户端请求服务端:客户端 “需要” 等待执行结果、才能继续执行其他事情
4、异步
客户端请求服务端:客户端 “不需要” 等待执行结果、发起请求之后、直接执行其他事情、服务端返回执行结果后、客户端执行回调函数
总结:
阻塞 I/O
(长连接)没有IO流请求也会有个子线程在等待IO流进行读写(一个连接一个线程)
非阻塞 I/O
(长连接)没有IO流请求不会有线程在等待IO流进行读写、当有IO流请求时、开启子线程执行IO流的读写(一个IO流请求一个线程、通过Selector(多路复用器)轮询所有连接、是否有IO流的请求)
纯属个人理解
不理解或者是有什么错误的地方、欢迎留言并会及时回复和改正的