I/O模型之BIO 基本介紹 Java BIO 就是傳統的 Java IO 編程,其相關的類和介面再 java.io 包下 BIO(blocking I/O):同步阻塞,伺服器實現模式為一個連接一個線程,即客戶端有連接請求時伺服器端就需要啟動一個線程進行處理,但是如果新啟動的這一個線程不做任何事情就 ...
I/O模型之BIO
基本介紹
- Java BIO 就是傳統的 Java IO 編程,其相關的類和介面再 java.io 包下
- BIO(blocking I/O):同步阻塞,伺服器實現模式為一個連接一個線程,即客戶端有連接請求時伺服器端就需要啟動一個線程進行處理,但是如果新啟動的這一個線程不做任何事情就會造成不必要的開銷,可以通過線程池機制改善
- BIO 模型適用於連接數目比較小且固定的架構,這種方式對伺服器資源要求比較高,併發性能差,JDK1.4以前使用
BIO編程的流程
- 伺服器端啟動一個SeverSocket
- 客戶端啟動Socket對伺服器端進行通信,預設情況下伺服器端需要對每個客戶建立一個線程與之通訊
- 客戶端發出請求後,先咨詢伺服器是否有線程響應,如果沒有則會等待或者被拒絕
- 如果伺服器有響應,客戶端當前線程會等待請求結束後才繼續執行
應用實例
實例說明
- 使用BIO模型編寫一個伺服器端,監聽6666埠,當有客戶連接時,就啟動一個線程與之通訊
- 要求使用線程池機制改善,可以連接多個客戶端
- 伺服器端可以接收客戶端發送的數據(使用telnet)
實例代碼:
public class BIOServer {
public static void main(String[] args) throws Exception {
//1、創建一個線程池
ExecutorService threadPool = Executors.newCachedThreadPool();
ServerSocket serverSocket = new ServerSocket(6666);
System.out.println("伺服器啟動了!!!");
while (true){
//監聽,等待客戶端連接
final Socket socket = serverSocket.accept();
System.out.println("連接到一個客戶端");
//2、如果有客戶端連接了,就創建一個線程,與之通訊(單獨寫一個方法)
threadPool.execute(new Runnable() {
public void run() {
//與客戶端進行通訊
handler(socket);
}
});
}
}
//編寫一個與客戶端通訊的handler方法
public static void handler(Socket socket){
//用於接收數據
byte[] bytes = new byte[1024];
//通過socket獲取輸入流
InputStream inputStream = null;
try {
System.out.println("線程id="+Thread.currentThread().getId()+"名字="+Thread.currentThread().getName());
inputStream = socket.getInputStream();
//迴圈讀取客戶端發送的數據
while(true){
int read = inputStream.read(bytes);
if (read!=-1){
//輸出客戶端發送的數據
System.out.println(“收到信息:”+new String(bytes,0,read));
}else{
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}finally {
System.out.println("關閉與客戶端的連接......");
try {
inputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
測試結果:
伺服器啟動了!!!
連接到一個客戶端
線程id=12名字=pool-1-thread-1
收到消息:nihao