仿写tomcat
- 建立Socket连接
- 获取连接信息
- 查看HTTP信息
建立Socket连接
这里我们也是创建一个专门管理socket的类
package com.tomcatServer.socket;
import java.io.*;
import java.net.ServerSocket;
/**
* 套接字存储
*
* @author ez4sterben
* @date 2023/08/15
*/
public class SocketStore {
private static ServerSocket socket;
public static void connect(Integer port) throws IOException {
socket = new ServerSocket(port);
}
public static void close() throws IOException {
socket.close();
}
public static ServerSocket getSocket() {
return socket;
}
}
随后在主方法中调用他,让serverSocket监听8080端口,并且一直尝试获取连接信息
try {
SocketStore.connect(8080);
while (true){
Socket accept = SocketStore.getSocket().accept();
}
} catch (IOException e) {
throw new RuntimeException(e);
}finally {
SocketStore.close();
}
获取连接信息
接下来在SocketStore中添加处理请求的方法,这里面的主要逻辑就是读取流数据,而且我们知道HTTP协议是一行一行的(看f12就知道了),所以给数据拼上换行符让我们可以直观的看一下这个数据
/**
* 处理请求
*
* @throws IOException ioexception
*/
public static void handleRequest(Socket accept) throws IOException {
// 获取输入输出流
BufferedReader in = new BufferedReader(new InputStreamReader(accept.getInputStream()));
PrintWriter out = new PrintWriter(accept.getOutputStream(), true);
// 定义字符串接收Http协议内容
String inputLine;
StringBuilder requestData = new StringBuilder();
// 读取数据
while ((inputLine = in.readLine()) != null && !inputLine.isEmpty()) {
requestData.append(inputLine).append("\r\n");
}
// 打印数据
System.out.println(requestData);
// 关闭资源
accept.close();
}
在主方法中调用
try {
SocketStore.connect(8080);
while (true){
Socket accept = SocketStore.getSocket().accept();
// 在这里加一行就行
SocketStore.handleRequest(accept);
}
} catch (IOException e) {
throw new RuntimeException(e);
}finally {
SocketStore.close();
}
查看HTTP信息
这时候我们运行一下项目,并且通过postman或者浏览器直接访问一下localhost:8080
如果用浏览器访问的话,可能网页只会一直加载,因为我们没作出响应,但是我们换一个可以打开的页面按下f12点击网络随便照一个请求看一看
可以看到socket接收到的流其实就是一个http的报文,那我们是不是就可以通过解析http报文来作出响应了?接下来的工作将在下一篇完成。
【仿写tomcat】四、解析http请求信息,响应给前端,HttpServletRequest、HttpServletResponse的简单实现