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进行阐述