传统Socket IO与NIO的比较

2/10/2017来源:ASP.NET技巧人气:1134

传统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个客户端。