Time: 2024-04-25 星期四 19:09:01
Author: Jackasher
手写服务器
这是一个处理静态文件的服务器,服务器可以解析浏览器的地址,并展现相应的页面
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 package org.example;import java.io.*;import java.net.ServerSocket;import java.net.Socket;public class Main { public static void main (String[] args) throws IOException { 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 ; } 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" ); } } }
接下来完成动态的Servlet,首先我们可以写一个类来解析URL中的请求地址,将其封装在servletMap里面,里面有对应的url和Class
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 package org.example;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.Node;import org.dom4j.io.SAXReader;import java.io.File;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Set;public class WebParser { public static Map<String, String> parser (String webAppName) throws DocumentException { String webPath = webAppName + "/WEB-INF/web.xml" ; SAXReader saxReader = new SAXReader (); org.dom4j.Document document = saxReader.read(WebParser.class.getResourceAsStream(webPath)); List<Node> nodes = document.selectNodes("/web-app/servlet" ); Map<String, String> servletInfoMap = new HashMap <String, String>(); for (Node node : nodes) { Element servletElement = (Element) node; Element servletNameEle = (Element) servletElement.selectSingleNode("servlet-name" ); String servletName = servletNameEle.getStringValue(); Element servletClassEle = (Element) servletElement.selectSingleNode("servlet-class" ); String servletClassName = servletClassEle.getStringValue(); servletInfoMap.put(servletName, servletClassName); } List<Node> servletMappingNodes = document.selectNodes("/web-app/servlet-mapping" ); Map<String, String> servletMappingInfoMap = new HashMap <String, String>(); for (Node node : servletMappingNodes) { Element element = (Element) node; Element element1 = (Element) element.selectSingleNode("url-pattern" ); String urlValue = element1.getStringValue(); Element element2 = (Element) element.selectSingleNode("servlet-name" ); String servletName = element2.getStringValue(); servletMappingInfoMap.put(servletName, urlValue); } Set<String> servletNames = servletInfoMap.keySet(); Map<String, String> servletMap = new HashMap <String, String>(); for (String servletName : servletNames) { String urlPattern = servletMappingInfoMap.get(servletName); String servletClass = servletInfoMap.get(servletName); servletMap.put(urlPattern, servletClass); } System.out.println(servletMap); return servletMap; } }