传统BIO通信
服务端,由一个Acceptor线程监听客户端的连接,接收到之后为每个客户端建立单独的线程进行链路处理,处理完成后,通过输出流返回给客户端,线程销毁。这就是典型的一请求一应答通信模型。
同步阻塞IO server端
package com.nio.two;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* BIO主要的问题在于一个线程只能处理一个客户端请求
* <p>Title: TimeServer</p>
* <p>Description: </p>
* @author jingweitao
* @date 2019年8月19日
*/
public class TimeServer {
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(8080);
System.out.print("Time server is start in port:"+8080);
Socket socket = null;
while(true){
socket = server.accept();
new Thread(timeServerHandler(socket)).start();
}
}
public static Runnable timeServerHandler(Socket socket) throws Exception{
Runnable task = () -> {
System.out.println();
System.out.println(Thread.currentThread().getName());
try(BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(),true);){
String currentTime = null;
String body = null;
while(true){
body = in.readLine();
if(body == null) break;
System.out.println("server receive msg :" + body);
currentTime = "msg0".equalsIgnoreCase(body)?System.currentTimeMillis()+"":"bad msg";
out.println(currentTime);
}
} catch (IOException e) {
e.printStackTrace();
}
};
return task;
}
}
同步阻塞IO client端
package com.nio.two;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class TimeClient {
public static void main(String[] args) throws Exception{
for(int i = 0;i<3;i++){
String msg = "msg";
send(msg+i);
}
}
private static void send(String msg) throws Exception{
try(Socket socket = new Socket("localhost",8080);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(),true);){
out.println(msg);
System.out.println("send msg succeed");
String response = in.readLine();
System.out.println("Now is :"+response);
}
}
}
服务端
客户端
服务端每当有一个新的客户端请求接入的时候,就必须创建一个新的线程,而线程是jvm虚拟机非常宝贵的系统资源,线程数量的膨胀会导致系统性能的下降。