1、傳統IO有兩個阻塞點,一個是接收客戶端的阻塞點,另外一個是客戶連接后接收消息的阻塞點
2、在單線程下,一個Server只能為一個客戶端服務,其他客戶端想連接服務端必須等待前一個客戶端釋放掉。
3、在多線程下,一個Server可以為多個客戶端服務,每來一個客戶端就給客戶端分配一個線程,這樣消耗的資源太多,類比server是一個餐廳,一個線程就是一個服務員,每來一個客人就安排一個服務員專門為其服務,如果客人多了,成本就高了。
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個客戶端。
新聞熱點
疑難解答