手写服务器(2)

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());

// 读取HTTP请求的第一行(请求行)
String requestLine = reader.readLine();
System.out.println("Received request: " + requestLine);

// 解析请求URI
String[] parts = requestLine.split(" ");
String requestURI = parts[1];

// 如果请求的是favicon.ico文件,则直接返回空响应
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));

// 构建HTTP响应
writer.write("HTTP/1.1 200 OK\r\n");
writer.write("Content-Type: text/html\r\n");
writer.write("\r\n"); // 空行,标志头部结束

// 将HTML内容写入响应
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";

//根据地址解析web.xml文件
SAXReader saxReader = new SAXReader();
org.dom4j.Document document = saxReader.read(WebParser.class.getResourceAsStream(webPath));
List<Node> nodes = document.selectNodes("/web-app/servlet");

//将Servlet里面的name和Class放入servletInfoMap里面
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();

//System.out.println(servletName + " " + servletClassName);

servletInfoMap.put(servletName, servletClassName);


}

//将servlet-mapping的name和URL放入servletmappingInfoMap里面
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);
}

//最后把URL和Class放在servletMap里面
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;
}
}


手写服务器(2)
http://example.com/2024/04/25/手写服务器(2)/
作者
Jack Asher
发布于
2024年4月25日
许可协议