IO操做-BIO

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

相關文章
相關標籤/搜索