BIO
在JDK1.4之前,基于Java的所有Socket通信都采用同步阻塞模式(BIO),这种一请求一应答的通信模型简化了上层的应用开发,但是在性能和可靠性方面却存在着巨大的瓶颈。当并发量增大,响应时间延迟增大之后,采用Java BIO开发的服务端只有通过硬件的不断扩容来满足高并发和低延迟,它极大的增加了企业的成本,随着集群规模的不断膨胀,系统的可维护性也面临巨大的挑战。
经典(传统)的网络服务设计如上图所示,对每个请求都会产生一个新的线程来进行处理,这种设计的缺点是,线程的创建本身是系统资源的一个开销,如果并发请求达到一定数量,响应将会变慢,甚至有可能因为系统资源不足而造成系统崩溃。
代码类似这样:
public class BlokingIoServer implements Runnable{
@Override
public void run() {
try {
//将服务绑定到指定端口
ServerSocket ss = new ServerSocket(8888);
while (!Thread.interrupted()){
//对 accept()方法的调 用将被阻塞,直到一个连接建立
final Socket clientSocket = ss.accept();
//为每个请求创建一个线程来处理
new Thread(new Handler(clientSocket)).start();
}
// or, single-threaded, or a thread pool
} catch (IOException ex) { /* ... */ }
}
static class Handler implements Runnable {
final Socket socket;
Handler(Socket s){
socket = s;
}
@Override
public void run() {
try {
byte[] input = new byte[1024];
socket.getInputStream().read(input);
byte[] output = process(input);
socket.getOutputStream().write(output);
} catch (IOException ex) { /* ... */ }
}
private byte[] process(byte[] cmd){
//do something
return null;
}
}
}