BIO 典型的一请求,一应答通信模型
缺点:该模型最大的问题就是,当客户端数量增加时,服务端的线程数与客户端并发的数量是 1:1 关系,我们知道在jvm 中线程是非常宝贵的资源,当线程数不断上升时,系统性能将不断下降,可能会出现堆栈溢出,创建线程失败等问题,并最终导致宕机或者僵死,不对外提供服务,下面就进行演示BIO编程模型。
1.TimeServer
public class TimeServer {
public static void main(String[] args) throws IOException {
int port = 8088;
if (args != null && args.length != 0) {
try {
port = Integer.valueOf(args[0]);
} catch (NumberFormatException e) {
port = 8080;
}
}
ServerSocket server = null;
try {
server = new ServerSocket(port);
System.out.println("The time server is start in port : " + port);
Socket socket = null;
while (true){
socket = server.accept();
new Thread(new TimeServerHandler(socket)).start();
//TODO
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if(server != null){
System.out.println("The time server close");
server.close();
server = null;
}
}
}
}
2.TimeServerHandler
public class TimeServerHandler implements Runnable {
private Socket socket;
public TimeServerHandler(Socket socket) {
this.socket = socket;
}
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 receive order : " + body);
currentTime = "QUERY TIME ORDER".equals(body) ?
new Date(System.currentTimeMillis()).toString() : "BAD ORDER";
out.println(currentTime);
}
} catch (IOException 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;
}
}
}
}
3.客户端 TimeClient
public class TimeClient {
public static void main(String[] args) {
int port = 8088;
if (args != null && args.length > 0) {
port = Integer.parseInt(args[0]);
}
Socket socket = null;
BufferedReader reader = null;
PrintWriter writer = null;
try {
socket = new Socket("127.0.0.1", port);
} catch (IOException e) {
System.out.println("客户端初始化失败");
}
try {
writer = new PrintWriter(socket.getOutputStream(),true);
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (IOException e) {
System.out.println("输入输出流获取失败");
}
writer.println("QUERY TIME ORDER");
System.out.println("查询语句发出");
try {
String readLine = reader.readLine();
System.out.println("Now time is " + readLine);
} catch (IOException e) {
System.out.println("读取失败");
}finally {
if(writer != null){
writer.close();
writer = null;
}
if(reader != null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
reader = null;
}
}
}
}