IO操作-BIO

BIO:block IO,即同步阻塞IO,主要应用于文件 IO 和网络 IO

 

这里主要说一下网络IO,以Socket编程为例进行说明

 

1、先建立Socket服务端

 1 //BIO 服务器端程序
 2 public class TCPServer {
 3     public static void main(String[] args) throws Exception {
 4         //1.创建ServerSocket对象
 5         ServerSocket ss=new ServerSocket(9999); //端口号
 6 
 7         while (true) {
 8             //2.监听客户端
 9             Socket s = ss.accept(); //阻塞
10             //3.从连接中取出输入流来接收消息
11             InputStream is = s.getInputStream(); //阻塞
12             byte[] b = new byte[10];
13             is.read(b);
14             String clientIP = s.getInetAddress().getHostAddress();
15             System.out.println(clientIP + "说:" + new String(b).trim());
16             //4.从连接中取出输出流并回话
17             //OutputStream os = s.getOutputStream();
18             //os.write("服务端内容".getBytes());
19             //5.关闭
20             //s.close();
21         }
22     }
23 }

2、建立Socket客户端

//BIO 客户端程序
public class TCPClient {
    public static void main(String[] args) throws Exception {
        while (true) {
            //1.创建Socket对象
            Socket s = new Socket("127.0.0.1", 9999);
            //2.从连接中取出输出流并发消息
            OutputStream os = s.getOutputStream();
            System.out.println("请输入:");
            Scanner sc = new Scanner(System.in);
            String msg = sc.nextLine();
            os.write(msg.getBytes());
            //3.从连接中取出输入流并接收回话
            InputStream is = s.getInputStream(); //阻塞
            byte[] b = new byte[20];
            is.read(b);
            System.out.println("服务端说:" + new String(b).trim());
            //4.关闭
            s.close();
        }
    }
}

 

从代码中可以清晰的看到,阻塞的地方总共有3处

1、在服务端accept的时候,服务端是处于阻塞阶段,如果没有客户端进行连接的时候,服务端会一直阻塞在那里

2、在服务端getInputStream的时候,如果客户端没有发送内容,服务端也会一直阻塞在这里

3、在客户端getInputStream的时候,如果服务端没有发送内容,客户端也会一直阻塞在这里

 

因此在高并发多线程的程序中BIO操作IO效率就会显得捉襟见肘,在下一篇文章中,博主会把相对应用比较多的NIO进行阐述

posted @ 2019-11-26 18:02  Arbet  阅读(210)  评论(0编辑  收藏  举报