本文目录
简易服务器(WebServer)的搭建
简介
本项目以http协议的一问一答方式为基础,通过socket来处理服务器和客户端之间的请求;
步骤和代码
1.创建服务器WebServer,通过socket传输数据,threadPool线程池管理线程
**
* 简易服务器,通过socket进行服务器和客户端之间的交流
*/
public class WebServer {
private ServerSocket serverSocket;
private ExecutorService threadPool;
public WebServer() {
try {
System.out.println("正在启动服务器...");
serverSocket = new ServerSocket(8088);
System.out.println("服务器启动成功...");
threadPool = Executors.newFixedThreadPool(50);
} catch (Exception e) {
e.printStackTrace();
}
}
private void start() {
try {
while (true) {
System.out.println("正在连接客户端...");
Socket socket = serverSocket.accept();
System.out.println("客户端连接成功");
// 客户端连接后通过线程进行管理
ClinetHandler handler = new ClinetHandler(socket);
threadPool.execute(handler);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
WebServer webServer = new WebServer();
webServer.start();
}
}
2.新建线程管理实现Runnable接口,负责管理连接后的线程
**
* 每次连接一个客户端服务器都会在这里处理与客户端链接
*/
public class ClinetHandler implements Runnable {
private Socket socket;
public ClinetHandler(Socket socket) {
this.socket = socket;
}
public void run() {
try {
//1.解析请求
HttpRequest request = new HttpRequest(socket);
//2.处理请求
HttpResponse response = new HttpResponse(socket);
String fileName = request.getRequestURI();
HttpServlet servlet = ServletContext.getServletMapping(fileName);
if (servlet != null) {
servlet.services(request, response);
} else {
String path = "./src/main/webapp" + fileName;
File entity = new File(path);
if (entity.exists() && entity.isFile()) {
response.setEntity(entity);
} else {
response.setStatusCode(404);
response.setStatusReason("NOT FOUND PAGE");
response.setEntity(new File("./src/main/webapp/root/notfound.html"));
}
}
//3.发送响应
response.flush();
System.out.println("发送响应完毕");
} catch (EmptyRequestException e1) {
System.out.println("------------->这是一个空请求");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
3.HttpRequest负责处理客户端发送过来的请求,并且解析请求参数
**
* 请求类,接受请求,处理请求
*/
public class HttpRequest {
private Socket socket;
//请求行的参数
private String requestMethod;
private String requestURL;
private String protocol;
//业务请求的参数
private String requestURI;
private Map<String, String> requestPar