同步阻塞IO(BIO)顾名思义就是指的发起一个请求到服务器后;等待服务器处理该请求处理结束后再进行后续处理;在服务器处理的过程中;客户端处于阻塞状态;例如;张三找领导李四签字;张三把文件交给李四后;李四签字;在李四签字的时候张三处理等待状态;不做任何其他的事情;(处于阻塞状态);李四签字结束后;文件还给张三;张三结束等待状态;出去开始做其他事情。
因此;BIP由客户端和服务器端2个程序组成;客户端发送请求;处于阻塞状态;等待服务器处理结束后;再结束阻塞状态;进行其他操作。
通常情况下;服务器程序会为每个请求新开一个java线程。服务器的线程数量和客户端的请求数量一一对应。在jdk1.4以前;java只能采用bio模式。以下通过具体代码说明bio通信程序。
TimeServer
package bio; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class TimeServer { public static void main(String[] args) throws IOException { int port = 8380; if (args != null&& args.length>0) { port=Integer.valueOf(args[0]); } ServerSocket server = null; try { server= new ServerSocket(port); System.out.println("The time server is start on port:"+port); Socket socket =null; while (true) { socket=server.accept(); new Thread(new TimeServerHandler(socket)).start(); } } catch (Exception e) { // TODO: handle exception }finally { if (server != null) { System.out.println("The time server close"); server.close(); server = null; } } } }
TimeServerHandler
package bio; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.util.Date; import java.net.Socket; public class TimeServerHandler implements Runnable { private Socket Socket; public TimeServerHandler(Socket socket) { this.Socket = socket; } @Override public void run() { BufferedReader in = null; PrintWriter out = null; try { in = new BufferedReader(new InputStreamReader(this.Socket.getInputStream())); out = new PrintWriter(this.Socket.getOutputStream(),true); String currentTime = null; String body = null; while (true) { body=in.readLine(); if (body==null) break; System.out.println("the time server recieved order:"+body); currentTime = "Query TIME ORDER".equalsIgnoreCase(body)?new Date(System.currentTimeMillis()).toString():"BAD ORDER"; out.println(currentTime); } } catch (Exception e) { if (in != null) { try { in.close(); } catch (IOException e1) { e1.printStackTrace(); } } if (out !=null) { out.close(); out=null; } if (this.Socket!=null) { try { this.Socket.close(); } catch (IOException e1) { e1.printStackTrace(); } this.Socket=null; } } } }
TimeClient
package bio; import java.io.*; import java.net.Socket; public class TimeClient { public static void main(String[] args) { int port = 8380; if (args == null&&args.length>0) { port = Integer.valueOf(args[0]); } Socket socket = null; BufferedReader in =null; PrintWriter out = null; try { socket =new Socket("127.0.0.1",port); in =new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()),true); out.println("Query TIME ORDER"); System.out.println("send order 2 server succeed."); String res = in.readLine(); System.out.println("Now is"+res); } catch (IOException e) { e.printStackTrace(); }finally { if (in != null) { try { in.close(); } catch (IOException e1) { e1.printStackTrace(); } } if (out !=null) { out.close(); out=null; } if (socket!=null) { try { socket.close(); } catch (IOException e1) { e1.printStackTrace(); } socket=null; } } } }