只做各种IO方式的横向比较,故不列具体机器规格
一、 服务端源码
TimeServer.class
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 = 8080;
if (args != null && args.length > 0) {
try {
port = Integer.valueOf(args[0]);
} catch (NumberFormatException e) {
}
}
try (ServerSocket 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();
}
}
}
}
TimeServerHandler.class
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Date;
public class TimeServerHandler implements Runnable {
private Socket socket;
public TimeServerHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try (BufferedReader in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
PrintWriter 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".equalsIgnoreCase(body) ? new Date(
System.currentTimeMillis()).toString() : "BAD ORDER";
out.println(currentTime);
}
} catch (Exception e) {
try {
this.socket.close();
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
}
}
二、Jemeter 压测结果
5线程
Jconsole结果
Jemeter吞吐量
CPU占用率17%,吞吐量47850
10线程
Jconsole结果
Jemeter吞吐量
CPU占用率18.7%,吞吐量66353
20线程
Jconsole结果
Jemeter吞吐量
CPU占用率18%,吞吐量69689
总体来看,服务端响应线程数随着Jemeter压测线程数量增加而增加,吞吐量也有所增加。BIO优缺点都比较明显,有点