BIO:block IO,即同步阻塞IO,主要應用於文件 IO 和網絡 IO編程
這裏主要說一下網絡IO,以Socket編程爲例進行說明服務器
一、先創建Socket服務端網絡
1 //BIO 服務器端程序 2 public class TCPServer { 3 public static void main(String[] args) throws Exception { 4 //1.建立ServerSocket對象 5 ServerSocket ss=new ServerSocket(9999); //端口號 6 7 while (true) { 8 //2.監聽客戶端 9 Socket s = ss.accept(); //阻塞 10 //3.從鏈接中取出輸入流來接收消息 11 InputStream is = s.getInputStream(); //阻塞 12 byte[] b = new byte[10]; 13 is.read(b); 14 String clientIP = s.getInetAddress().getHostAddress(); 15 System.out.println(clientIP + "說:" + new String(b).trim()); 16 //4.從鏈接中取出輸出流並回話 17 //OutputStream os = s.getOutputStream(); 18 //os.write("服務端內容".getBytes()); 19 //5.關閉 20 //s.close(); 21 } 22 } 23 }
二、創建Socket客戶端多線程
//BIO 客戶端程序 public class TCPClient { public static void main(String[] args) throws Exception { while (true) { //1.建立Socket對象 Socket s = new Socket("127.0.0.1", 9999); //2.從鏈接中取出輸出流併發消息 OutputStream os = s.getOutputStream(); System.out.println("請輸入:"); Scanner sc = new Scanner(System.in); String msg = sc.nextLine(); os.write(msg.getBytes()); //3.從鏈接中取出輸入流並接收回話 InputStream is = s.getInputStream(); //阻塞 byte[] b = new byte[20]; is.read(b); System.out.println("服務端說:" + new String(b).trim()); //4.關閉 s.close(); } } }
從代碼中能夠清晰的看到,阻塞的地方總共有3處併發
一、在服務端accept的時候,服務端是處於阻塞階段,若是沒有客戶端進行鏈接的時候,服務端會一直阻塞在那裏高併發
二、在服務端getInputStream的時候,若是客戶端沒有發送內容,服務端也會一直阻塞在這裏spa
三、在客戶端getInputStream的時候,若是服務端沒有發送內容,客戶端也會一直阻塞在這裏線程
所以在高併發多線程的程序中BIO操做IO效率就會顯得捉襟見肘,在下一篇文章中,博主會把相對應用比較多的NIO進行闡述code