Time: 2024-04-25 星期四 19:09:01
Author: Jackasher
手写服务器主流程
有个不错的思想 就是,把业务交给用户来做,一个Servlet接口,用户来写,然后固定方法名,这样服务器开发者就可可以反射创建这个类调用使用者的业务代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| package org.example;
import javax2.Servlet; import org.dom4j.DocumentException;
import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.Map;
public class Main { public static void main(String[] args) throws IOException, DocumentException, ClassNotFoundException, InstantiationException, IllegalAccessException { ServerSocket serverSocket = new ServerSocket(8080); System.out.println("Server started on port 8080");
while (true) { Socket socket = serverSocket.accept(); System.out.println("Connection established");
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter writer = new PrintWriter(socket.getOutputStream());
String requestLine = reader.readLine(); System.out.println("Received request: " + requestLine);
String[] parts = requestLine.split(" ");
String requestURI = parts[1];
if (requestURI.equals("/favicon.ico")) { writer.write("HTTP/1.1 200 OK\r\n"); writer.write("\r\n"); writer.flush(); writer.close(); reader.close(); socket.close(); System.out.println("Connection closed"); continue; }
if (requestURI.endsWith(".html")) { InputStream inputStream = Main.class.getResourceAsStream(requestURI); BufferedReader fileReader = new BufferedReader(new InputStreamReader(inputStream));
writer.write("HTTP/1.1 200 OK\r\n"); writer.write("Content-Type: text/html\r\n"); writer.write("\r\n");
String line; while ((line = fileReader.readLine()) != null) { writer.write(line + "\r\n"); }
writer.flush();
writer.close(); reader.close(); socket.close(); System.out.println("Connection closed"); }else { String webName = "/" + requestURI.split("[/]")[1];
Map<String, String> servletMap = WebParser.parser(webName); String urlPattern = "/" + requestURI.substring(1 + webName.length()); String servletClass = servletMap.get(urlPattern); Class<?> aClass = Class.forName(servletClass); Object o = aClass.newInstance(); Servlet servlet = (Servlet) o; servlet.service(); }
} } }
|