BIO的阻塞


java的網絡編程大概可以分為BIO,NIO,AIO三種

第一種BIO是傳統的io流為基礎的,他是一種阻塞式的。

這是客戶端

public class Client {
    public static void main(String[] args) {
        Scanner se=new Scanner(System.in);
        System.out.println("請輸入客戶端編號:");
        int code=se.nextInt();
        System.out.println("客戶端編號是:"+code);
        Socket socket=null;

        try
        {
            System.out.println("客戶端"+code+"開始連接服務器...");
            socket=new Socket("127.0.0.1",8888);
            if(socket!=null){
                System.out.println("客戶端"+code+"連接服務器成功!");
            }
            OutputStream out= socket.getOutputStream();
            while (true){

                System.out.println("客戶端"+code+"請輸入要發送的內容:");
               String str=se.next();
               if(str.trim().equalsIgnoreCase("quit"))
                   break;
               out.write((code+"--->"+str).getBytes("utf-8"));
            }
            out.close();
            socket.close();


        }catch (Exception ex){
            ex.printStackTrace();
        }

    }

  這是服務端

public class Server {
    private static  int port=8888;
    public static void main(String[] args) throws IOException {

        ServerSocket serverSocket=null;
                try{
                    serverSocket=new ServerSocket(port);
                    System.out.println("服務端開始監聽:"+port);
                    while (true){
                     var clientSocket= serverSocket.accept();//第一處阻塞
                        System.out.println("接受一個客戶端請求");
                        InputStream in=clientSocket.getInputStream();
                        int hasread=0;
                        byte[] bufer=new byte[1024];
                        while ((hasread=in.read(bufer))!=-1){//第二處阻塞
                            System.out.println("客戶端輸入字符:"+new String(bufer,0,hasread));
                        }
                        clientSocket.close();
                        in.close();
                    }

                }
                catch (Exception ex){
                    ex.printStackTrace();
                }finally {
                    try {
                        serverSocket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                }
    }

  服務端在監聽客戶端,和接收客戶端時,是阻塞的狀態。

單獨把服務端運行

 

 程序阻塞在監聽方法處

起一個客戶端

 

 顯示連接服務器成功

 

 此時服務器阻塞在讀取客戶端輸入的文字處

 

 此時通信成功,然而程序時在不停的循環等待中。

此時在起一個客戶端,並發送內容

 

 

 服務器是收不到內容的,因為他阻塞等待客戶端1發送內容,此時把客戶端1關停。

 

 

 

 服務端收到了客戶端2的信息。

所以說,這個BIO是阻塞式的,要想實現多個客戶端同時發送信息。需要多個線程。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM