美文网首页Java those things
NETTY (一)了解NIO

NETTY (一)了解NIO

作者: M_ENG | 来源:发表于2018-03-15 18:13 被阅读20次

    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流的请求)


    纯属个人理解   

    不理解或者是有什么错误的地方、欢迎留言并会及时回复和改正的

    相关文章

      网友评论

        本文标题:NETTY (一)了解NIO

        本文链接:https://www.haomeiwen.com/subject/lubhqftx.html