BIO 介紹
BIO 編程方式通常是在 JDK1.4 版本之前常用的編程方式。編程實現過程爲:首先在服務端啓動一個 ServerSocket 來監聽網絡請求,客戶端啓動 Socket 發起網絡請求,默認情況下 ServerSocket 會建立一個線程來處理此請求,如果服務端沒有線程可用,客戶端則會阻塞等待或遭到拒絕。同步並阻塞,服務器實現模式爲一個連接一個線程,即客戶端有連接請求時服務器端就需要啓動一個線程進行處理,如果這個連接不做任何事情會造成不必要的線程開銷,當然可以通過線程池機制改善。
BIO 圖示
代碼實現
服務端
public class Server {
public static void main(String[] args) throws IOException {
// 1.定義一個serverSocket,並定義端口是 9999
ServerSocket ss = new ServerSocket(9999);
while(true){
// 2.監聽k客戶端的socket請求
Socket socket = ss.accept();
new SocketThread(socket).start();
}
}
}
處理實現
public class SocketThread extends Thread{
private Socket socket;
public SocketThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
// 1.從客戶端傳來的socket裏面獲取到流
InputStream is = socket.getInputStream();
// 2.將字節輸入流包裝成一個緩衝字符輸入流
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String msg;
while((msg = br.readLine())!=null){
System.out.println("服務端接受到信息:"+msg);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
客戶端
public class Client {
public static void main(String[] args) throws IOException {
// 1.創建socket將對象請求服務端的鏈接
Socket socket = new Socket("127.0.0.1",9999);
// 2.從socket對象中獲取一個字符輸出流
OutputStream os = socket.getOutputStream();
PrintStream ps = new PrintStream(os);
Scanner scanner = new Scanner(System.in);
while(true){
System.out.print("請說:");
String msg = scanner.nextLine();
ps.println(msg);
// 推送發送內容給服務端
ps.flush();
}
}
}