传统Socket IO与NIO的比较

本文对比了传统IO与NIO的特点。传统IO在单线程下无法同时处理多个客户端请求,而在多线程下虽然可以同时处理多个客户端但资源消耗较大。NIO通过非阻塞方式工作,采用Selector监听多个SocketChannel的状态变化,从而实现了单线程环境下高效地处理大量客户端连接。

传统Socket IO特点

1、传统IO有两个阻塞点,一个是接收客户端的阻塞点,另外一个是客户连接后接收消息的阻塞点

2、在单线程下,一个Server只能为一个客户端服务,其他客户端想连接服务端必须等待前一个客户端释放掉。

3、在多线程下,一个Server可以为多个客户端服务,每来一个客户端就给客户端分配一个线程,这样消耗的资源太多,类比server是一个餐厅,一个线程就是一个服务员,每来一个客人就安排一个服务员专门为其服务,如果客人多了,成本就高了。

这里写图片描述

NIO特点

1、NIO主要有ServerSocketChannel,Selector,SocketChannel,SelectionKey几个类组成

2、NIO是单线程的

3、只有一个阻塞点

4,、如果拿NIO比作成一个餐厅的话,ServerSocketChannel就相当于整个餐厅,SocketChannel相当于客人,Selector相当于服务员,SelectionKey相当于服务种类(迎接客人,点餐等)

A、餐厅开张时,会先打开大门,这里的大门相当于端口号,serverChannel.configureBlocking(false); //设置为非阻塞,相当于服务员不一定要站在大门口

     serverChannel.socket().bind(new InetSocketAddress(port));//大门地址  this.selector = Selector.open();//服务员开始工作

B、serverChannel.register(selector, SelectionKey.OP_ACCEPT);//告诉服务员要看着大门的情况,如果有客人来就要上去迎接

C、Set<SelectionKey> keys = selector.selectedKeys();迭代服务种类,此时服务员时刻都在监控着大门,一旦大门有客人进来,他就知道

D、如果Set里有值了,说明有客人来或者有客人点餐了,先判断下这个值是客人来了还是点餐了,第一次来的肯定是客人来了

E、key.isAcceptable() 表示客人从大门进来了,SocketChannel channel = server.accept(); 获得了这个客人的信息,channel.register(selector, SelectionKey.OP_READ);表示客人进来了,那就要叫他坐下来,这是服务员就要记住这个客人随时都要点餐了

F、key.isReadable() 表示客户开始点餐,客人把点餐的信息告诉服务员。

这里写图片描述

传统IO与NIO的主要区别就是NIO不要一直阻塞着,一旦有消息过来会主动告诉服务端,另外一个是NIO一个单线程可以处理N个客户端。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值