1.简述
JAVA BIO是同步并阻塞,阻塞主要是针对网络IO也就是Socket IO。服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
2.BIO实现
(1)服务器实现如下
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/**测试类 */ public class Test{ public static void main(String[] args) throws IOException { int Port = 7777; ServerSocket serverSocket = null; BufferedWriter bw = null; try { //1.创建服务器对象,并传入端口 serverSocket = new ServerSocket(Port); System.out.println("服务器已启动!正在监听端口"+Port); while (true){ //2.从连接请求队列中取出一个客户连接 Socket socket = serverSocket.accept(); System.out.println("客户端 "+socket.getPort()+" 已连接"); //3.创建缓冲区输入流,读取客户传递数据 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); //4.创建缓存区输出流 bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //5.读取客户端传递的数据并回复 String message = br.readLine(); if (message != null){ System.out.println("收到一条来自客户端 "+socket.getPort()+" 发送的消息:"+message); } //加了 readLine才能生效 bw.write("你才是" + message + " "); bw.flush(); //清理缓冲区 } } catch (IOException e) { e.printStackTrace(); } finally { if(bw != null){ try { bw.close(); System.out.println("服务器挂掉了。。再见"); } catch (IOException e) { e.printStackTrace(); } } } } }
(2)客户端实现如下
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class Test2{ public static void main(String[] args) { String Host = "127.0.0.1"; final int Port = 7777; BufferedWriter bw = null; try { //1.创建客户端对象,并指定连接的服务器ip和端口 Socket socket = new Socket(Host,Port); //2.创建缓冲区输入流,读取服务器传递数据 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); //3.创建缓存区输出流 bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //4.获取控制台输入数据 BufferedReader cs = new BufferedReader(new InputStreamReader(System.in)); //5.把控制台输入数据发送给服务器 String message = cs.readLine(); bw.write(message+" "); bw.flush(); //6.读取服务器回复 String responseMsg = br.readLine(); System.out.println("收到了来自服务器的回复:" + responseMsg); } catch (IOException e) { e.printStackTrace(); } finally { if(bw != null){ try { bw.close(); System.out.println("客户端关闭了连接"); } catch (IOException e) { e.printStackTrace(); } } } } }
(3)总结
BIO服务器有一个接受请求的主线程和工作线程池组成。每个请求对应一个线程。IO操作和业务操作都有工作线程处理。优点是线程模型简单,程序编写简单。缺点是一个连接对应一个线程,线程资源创建过多,较为浪费。