您的位置:首页 > 编程语言

同步阻塞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

  • 点赞
  • 收藏
  • 分享
  • 文章举报
chi5967 发布了0 篇原创文章 · 获赞 0 · 访问量 52 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: