BIO簡介
Java I/O淹朋,也叫Blocking I/O,也就是阻塞式I/O钉答。
BIO的流程比較簡單础芍,在服務端創(chuàng)立一個ServerSocket去監(jiān)聽,等待連接数尿÷匦裕客戶端創(chuàng)建一個Socket連接過來,服務器端就能接收到連接請求右蹦,建立一個連接诊杆。連接建立起來后歼捐,服務端和客戶端就能通過一個流式API進行一個數據通信,進行一些讀寫操作晨汹。
單線程BIO示例
來看一個BIO的例子豹储,服務端創(chuàng)立一個ServerSocket,然后等待連接(accept就是阻塞的):
連接過來以后淘这,使用IO流方式讀取和寫入數據剥扣,處理的方法如下:
客戶端發(fā)起Socket連接,然后同樣用IO流的方式讀取和寫入數據:
上面這些代碼相信很多人都寫過铝穷,也都熟悉钠怯,可以看到單線程的BIO編程邏輯清晰,內容簡單曙聂,(可惜效率低晦炊。。宁脊。)刽锤,運行結果如下:
程序整個過程就是一個單線程的,如果這個時候再來一個客戶端連接朦佩,那么新來的客戶端就無法建立連接并思,因為上一個連接已經阻塞在while循環(huán)中。
多線程BIO示例
來看一個多線程的BIO例子语稠,同樣是服務端創(chuàng)立一個ServerSocket宋彼,然后等待連接(accept就是阻塞的),區(qū)別是仙畦,來一個連接就啟動一個新線程去處理:
處理的線程方法如下输涕,操作上和單線程的差不多:
多線程體現在服務端,客戶端的寫法基本沒變慨畸,下面我們啟動一個服務端和三個客戶端莱坎,查看效果:
這種方式明顯的缺點就是當連接多的時候,線程數量會爆掉寸士,無法支持高并發(fā)的情況檐什。雖然可以使用線程池保護機器,但是無法從根本上解決高并發(fā)問題弱卡。下面是使用線程池的例子:
客戶端代碼一樣乃正,此處不再演示。
代碼地址:https://gitee.com/blueses/netty-demo??01