同步阻塞IO(BIO)原理与代码样例
2020-03-01 05:02
260 查看
同步阻塞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; } } } }
转载于:https://my.oschina.net/zpf2016/blog/1938772
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- javaNIO原理(含代码)及与 同步阻塞IO 、伪异步IO比较 (A)
- javaNIO原理(含代码)及与 同步阻塞IO 、伪异步IO比较
- IO中同步异步,阻塞与非阻塞 -- 原理篇
- IO通信模型(一)同步阻塞模式BIO(Blocking IO)
- Socket通信之BIO(同步阻塞IO)、PAIO(伪异步阻塞IO)、NIO(异步非阻塞IO)、AIO(异步非阻塞IO)、netty5之IO
- JavaIO之-BIO(同步阻塞线程)
- Netty之BIO(同步阻塞IO)、PIO(伪异步阻塞IO)、NIO(异步非阻塞IO)、AIO(异步非阻塞IO)、Netty
- Netty之BIO(同步阻塞IO)、PIO(伪异步阻塞IO)、NIO(异步非阻塞IO)、AIO(异步非阻塞IO)
- IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)
- IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)
- IO模型:同步、异步、阻塞、非阻塞
- Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)
- 同步与异步IO、阻塞与非阻塞IO
- IO - 同步,异步,阻塞,非阻塞
- 同步与异步IO、阻塞与非阻塞IO
- IO中同步异步,阻塞与非阻塞 -- 通俗篇
- 关于IO的同步、异步、阻塞、非阻塞
- IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)
- Java阻塞队列BlockingQueue实现生产者消费者-只有代码-不讲原理
- IO中同步、异步与阻塞、非阻塞的区别