BIO(Blocking IO) 同步阻塞模型,一個用戶端連接配接對應一個處理線程。
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