天天看點

java的BIO同步阻塞模型

BIO(Blocking IO) 同步阻塞模型,一個用戶端連接配接對應一個處理線程。

java的BIO同步阻塞模型

java案例:

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * BIO 阻塞IO
 * 
 * 在JDK1.4出來之前,我們建立網絡連接配接的時候采用BIO模式,需要先在服務端啟動一個ServerSocket,
 * 然後在用戶端啟動Socket來對服務端進行通信,預設情況下服務端需要對每個請求建立一堆線程等待請求,
 * 而用戶端發送請求後,先咨詢服務端是否有線程相應,如果沒有則會一直等待或者遭到拒絕請求,
 * 如果有的話,用戶端會線程會等待請求結束後才繼續執行。
 *
 */
public class BIOServer {
    public static void main(String[] args) throws IOException {
        //線程池機制
        //1、建立一個線程池
        ExecutorService executorService= Executors.newCachedThreadPool();
        ServerSocket serverSocket = new ServerSocket(6666);
        System.out.println("伺服器啟動了");
        while(true){
            Socket socket = serverSocket.accept();
            //2、如果有用戶端連結,就建立一個線程,與之通訊(單獨寫一個方法)
            executorService.execute(()->{
                System.out.println(Thread.currentThread().getName()+"目前線程");
                handler(socket);
            });
        }
    }

    public static void handler(Socket socket){
        try {
            byte[] bytes=new byte[1024];
            //通過socket擷取輸入流
            InputStream inputStream = socket.getInputStream();
            while(true){
                System.out.println("線程在等待.......");
                System.out.println(Thread.currentThread().getName()+"目前線程-----");
                int read = inputStream.read(bytes);
                if(read!=-1){
                    System.out.println(Thread.currentThread().getName()+"目前線程+++++");
                    System.out.println(new String(bytes,0,read));
                }else {
                    break;
                }
            }

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            System.out.println("關閉與client的連結");
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}      

開啟指令菜單,

telnet 127.0.0.1 6666