本文所开发的HTPP服务器的IO模型为同步阻塞式I/O。我们发现,BIO 主要的问题在于每当有一个新的客户端请求接入时,服务端必须创建一个新的线程处理新接入的客户端链路。在高性能服务器应用领域,往往需要面向成千上万个客户端的并发连接,这种模型显然无法满足高性能、高并发接入的场景。我的下一篇文章将会通过队列实现1个或者多个线程处理N个客户端的模型。
package com.cctv.http;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @Title:
* @BelongProjecet http-demo
* @BelongPackage com.cctv.http
* @Description:
* @Copyright CCTV.com
* @Author: lingchuan
* @Date: 2020-04-27 11:32
*/
public class SingleThreadHttpServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8080);
while (true) {
Socket socket = serverSocket.accept();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line="";
while((line=bufferedReader.readLine())!=null&&line.equals("")){}
PrintWriter printWriter = new PrintWriter(socket.getOutputStream(),true);
printWriter.println("HTTP/1.1 200 OK");
printWriter.println("Content-Type: text/html; charset=UTF-8");
printWriter.println("");
printWriter.println("It's Work!");
printWriter.close();
socket.close();
}
}
}
package com.cctv.http;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @Title:
* @BelongProjecet http-demo
* @BelongPackage com.cctv.http
* @Description:
* @Copyright CCTV.com
* @Author: lingchuan
* @Date: 2020-04-27 11:32
*/
public class MultiThreadHttpServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8080);
ExecutorService executor = Executors.newFixedThreadPool(5);
while (true) {
Socket socket = serverSocket.accept();
executor.execute(new Server(socket));
//new Thread(new Server(socket)).start();
}
}
}
class Server implements Runnable {
private Socket socket;
public Server(Socket socket) throws IOException {
this.socket = socket;
}
public void run() {
try {
System.out.println("Thread:"+Thread.currentThread());
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = "";
while ((line = bufferedReader.readLine()) != null && line.equals("")) {
}
PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
printWriter.println("HTTP/1.1 200 OK");
printWriter.println("Content-Type: text/html; charset=UTF-8");
printWriter.println("");
printWriter.println("It's Work!");
printWriter.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}