Java 阻塞IO

服務端

每個連接新起一個線程去處理

public class Server implements Runnable{

    private Socket socket;

    private BufferedReader bufferedReader;

    private PrintWriter printWriter;

    public Server(Socket socket, BufferedReader bufferedReader, PrintWriter printWriter){
        this.socket = socket;
        this.bufferedReader = bufferedReader;
        this.printWriter = printWriter;
    }

    @Override
    public void run(){
        try{
            System.out.println(socket.getPort() + " " + Thread.currentThread().getName()) ;
            Scanner scanner = new Scanner(System.in);
            while (true){
                String string = bufferedReader.readLine();
                System.out.println("Server讀到:"+string);
                if(string.equals("exit")){
                    printWriter.println(string);
                    printWriter.flush();
                    break;
                }
                System.out.println("Server端請輸入:");
                String str = scanner.next();
                printWriter.println(str);
                printWriter.flush();
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            System.out.println("請求結束,關閉資源");
            try {
                socket.close();
                bufferedReader.close();
                printWriter.close();
            }catch (IOException e){
                e.printStackTrace();
            }
            System.out.println("請求結束,資源已關閉");
        }
    }

    public static void main(String[] args) throws IOException{
        ServerSocket serverSocket = new ServerSocket(8000);
        while (true){
            Socket clientSocket = serverSocket.accept();
            System.out.println("連接成功:" + clientSocket.getRemoteSocketAddress());
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
            new Thread(new Server(clientSocket, bufferedReader, printWriter)).start();
        }
    }
}

客戶端

public class Client {

    public static void main(String[] args) throws  Exception{
        Socket socket = new Socket("localhost", 8000);
        Scanner scanner = new Scanner(System.in);
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));

        try{
            while (true){
                System.out.println("客戶端請輸入:");
                String str = scanner.next();
                printWriter.println(str);
                printWriter.flush();
                String res = bufferedReader.readLine();
                System.out.println("收到服務端的信息:" + res);
                if(res.equals("exit"))
                    break;
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            scanner.close();
            socket.close();
            bufferedReader.close();
            printWriter.close();
        }
    }
}

線程處理

多線程

缺點

  1. 在任何時候都可能有大量的線程處於休眠狀態,只是等待輸入或者輸出數據就緒,這可能算是一種資源浪費
  2. 需要爲每個線程的調用棧都分配內存,其默認值大小區間爲64 KB 到1 MB,具體取決於操作系統
  3. 即使Java 虛擬機(JVM)在物理上可以支持非常大數量的線程,但是遠在到達該極限之前,上下文切換所帶來的開銷就會帶來麻煩,例如,在達到10 000 個連接的時候
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章