You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
and/README.md

209 lines
6.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

![](IMG/Pasted%20image%2020241011225855.png)
![](IMG/Pasted%20image%2020241011225913.png)
![](IMG/Pasted%20image%2020241013113954.png)
### 基础
- MyHttpRequest
- `parse()`(解析流)
- `parseUri()`请求的内容存储到uri
- `getUri()`返回uri
- MyHttpResponse
- `sendRedirect(String uri)`判断资源是否存在不存在返回404 ,存在返回目标资源)
- `getResponseMessage(String code, String message)`(构造响应消息)
- MyHttpServer
- `start()`(循环接收浏览器请求,并且处理请求)
- Test`
- `main()`(主方法测试类)
###### MyHttpRequest
```C#
import java.io.IOException;
import java.io.InputStream;
public class MyHttpRequest {
private InputStream inputStream;
private String uri;
public MyHttpRequest(InputStream inputStream) {
this.inputStream = inputStream;
}
/**
* 解析流
*/
public void parse(){
try {
byte[] bytes = new byte[1024];
inputStream.read(bytes);
String request = new String(bytes);
parseUri(request);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 请求判断
*/
public void parseUri(String request) {
int index1,index2;
index1 = request.indexOf(" ");//找空格下标
index2 = request.indexOf(" ",index1+1);//找空格下标2
uri = request.substring(index1+1,index2);//输出资源位置
System.out.println(uri);
}
public String getUri() {
return this.uri;
}
}
```
###### MyHttpResponse
```C#
import java.io.*;
public class MyHttpResponse {
private int statusCode;
private String statusMessage;
private OutputStream outputStream;
public MyHttpResponse(OutputStream outputStream){
this.outputStream = outputStream;
}
public void sendRedirect(String uri){
//判断资源是否存在
// 不存在返回404
// 存在返回目标资源
File file = new File(System.getProperty("user.dir")+"/WebContent" + uri);
if (file.exists()){
try {
FileInputStream fileInputStream = new FileInputStream(file);
byte[] bytes = new byte[(int)file.length()];
fileInputStream.read(bytes);
String result = new String(bytes);
// System.out.println(result);
String response = getResponseMessage("200,",result);
this.outputStream.write(response.getBytes());
} catch (IOException e) {
throw new RuntimeException(e);
}
}else {
try {
String error = getResponseMessage("404","404 File Not Found!");
this.outputStream.write(error.getBytes());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
public String getResponseMessage(String code, String message){
return "HTTP/1.1 " + code + "\r\n" +
"Content-Type: text/html\r\n" +
"Content-Length: " + message.length() +
"\r\n" +
"\r\n" +
message;
}
}
```
###### MyHttpServer
```C#
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class MyHttpServer {
private int port = 8080;
public void receiving()
{
try{
//create socket service
ServerSocket serverSocket = new ServerSocket(port);
while(true){
//获取连接对象
Socket socket = serverSocket.accept();
//获取链接对象输入流
InputStream inputStream = socket.getInputStream();
//创建request
MyHttpRequest request = new MyHttpRequest(inputStream);
//解析请求
request.parse();
//创建响应
OutputStream outputStream = socket.getOutputStream();
MyHttpResponse response = new MyHttpResponse(outputStream);
//进行响应
response.sendRedirect(request.getUri());
}
//loop accept requests
}catch (Exception e){
}
}
}
```
###### Test
```C#
public class Test {
public static void main(String[] args) {
System.out.println("server startup successfully");
MyHttpServer server = new MyHttpServer();
server.receiving();
}
}
```
### 进阶
![](IMG/Pasted%20image%2020241012213802.png)
![](IMG/Pasted%20image%2020241012213832.png)
Tomcat的两个重要身份
1. http服务器
2. Tomcat是一个Servlet容器
使用Servlet规范来实现Tomcat
- AbstractHttpServletRequest *(implements HttpServletRequest)*
- AbstractHttpServletResponse *(implements HttpServletResponse)*
- ResponseServletOutputStream *(extends ServletOutputStream)*
- `write(int b)`
- `getBytes()`
- `getPos()`
- MyHttpRequest *(extends AbstractHttpServletRequest)*
- `parse()`(解析流)
- `parseMessageLine()`(请求行解析)
- `getMethod()`(返回请求方式)
- `getRequestURL()`(返回请求地址,通常为**appName/Servlet**
- `getProtocol()`(返回协议)
- MyHttpResponse *(extends AbstractHttpServletResponse)*
- `public MyHttpResponse(MyHttpRequest request, OutputStream outputStream)`(构造方法)
- `setStatus(int i, String s)`
- `getStatus()`
- `addHeader(String s, String s1)`
- `ResponseServletOutputStream getOutputStream()`servlet的doGet所write的消息体
- `complete()`(完成响应,调用下面三个方法)
- `sendResponseMsgLine()`
- `sendResponseMsgHeader()`
- `sendResponseMsgBody()`
- Tomcat (添加线程池)
- `main(String[] args)`启动Tomcat
- `deployApps()`(利用反射部署指定目录下的应用)
- `start()`(循环接收浏览器请求,并且处理请求)
- `getAllFilePath()`(递归的获得项目内所有文件)
- `getContextMap()`(添加应用映射)
- SocketProcessor *(implements Runnable)*
- `run()`调用processSocket
- `processSocket(Socket socket)`(处理请求)
- Context
- `addUrlPatternMapping(String pattern, Servlet servlet)`添加应用下Servlet映射
- `getByUrlPatternMapping(String urlPattern)` 得到Servlet对象
- DefaultServlet *(extends HttpServlet)*