Java - BIO 總結

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();
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章