BIO和NIO

BIO和NIO的问题以及优化

BIO模型(入门案例)

1. BIO模型

其实是阻塞模型,就是我们服务器端里面的调用到的accept()方法,当这个没有请求连接的的时候,他自己就会进入一个阻塞的状态,等待客户端的连接

2.BIO模型存在的问题

(1) 当只有一个线程的时候,不能处理多个连接,也就是当你这个并发量比较大的时候,不能进行多个并发
(2)当你开启多个线程内存占用大,资源消耗的比较大

3.BIO问题的优化

可以把原来的连接,改成一个线程,也就是当有来连接的时候你就给他写一个子线程,这样能在一定程度上进行多个并发,但是他还存在一定的问题,比如C10K,C10M这两个问题,当有这么要来进行连接时,你就需要些上千万个线程,那么开一个线程都会占一定的内存,那这么多的线程会占你的多少内存,你的服务器会不会爆掉,还需要解决这个C10K的问题,就搞一个pool线程池,里面放上你要的线程数量,你的线程池也就是规定了你的这的并发数

NIO模型(入门案例)

1. NIO模型是为了解决BIO的一些弊端,他是一个非阻塞模型,他可以通过一个configBlocking(false)这个方法来设置,说他是一个非阻塞的,如果是true,则跟我们的BIO是一样的都是阻塞模型,在NIO模型中,accept()方法是不阻塞的

请添加图片描述

2.NIO和BIO使用的API不同,核心类库不同,当有多个客户端来连接时,可以用一个List集合把这些连接放进去,样一来放到集合中的是对象,而不是线程,这就解决了BIO开启多个线程占用内存的一个问题,在NIO中你还能直接的看到你现在有几个连接,当有连接的时候,socketChannel会给我们显示出来和谁连接成功了,

请添加图片描述

3.存在问题,当我们想要看都发送了哪些数据的时候,你要将所有的数据都有用集合遍历出来,如果有十万条连接,但是集合中只是有几十条数据,要将这十万个都要遍历出来,这么一来,他就很浪费我们的运行时间
4.解决问题:使用selector多路复用器,也就是他会收集那些有读写数据的channel放到集合里面去,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BzgMqgws-1629986251890)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20210826153028429.png)]

5. Selector多路复用器使用流程

(1)客户端和服务器端进行连接,要连接成功

(2)当客户端给服务器端发送数据,这个时候服务器端产生一个读事件,也是IO操作,随之产生channel(客户端sockChannel和服务器端serverSocketchannel)

(3)创建Selector,通过Selector的静态方法open(),也就是

Selector selector=Selector.open();

请添加图片描述

(4)分别将channel进行注册,注册到Selector中,服务器端通过服务器(serverSocketchannel).register()方法来实现,客户端同理,也就是

serverSocketchannel .configureBloking(false);//将服务器端设置成非阻塞状态
SelectionKey key=serc=sverSocketchannel .register(selector,Selectionkey.OP_READ);

请添加图片描述

总结

NIO与Selector多路复用器流程图如下:
请添加图片描述 以上就是关于BIO与NIO的区别,以及出现的不足与优化,以上内容由我个人理解,如有错误请批评指正,感谢您的翻阅!

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值