DIY-Tomcat part 2 实现Processor和Connector以及测试所用TestClient

server/2024/12/2 1:37:41/
http://www.w3.org/2000/svg" style="display: none;">

实现Processor

java">package Webserver.src.processor;import java.io.IOException;import Webserver.src.connector.Request;
import Webserver.src.connector.Response;public class StaticProcessor {public void process(Request request, Response response) {try {response.sendStaticResource();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}
  • 访问静态资源
  • 简单的调用response中的sendStaticResource即可

实现Connector

java">package Webserver.src.connector;import java.io.Closeable;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;import Webserver.src.processor.StaticProcessor;public class Connector implements Runnable{private static final int DEFAULT_PORT = 8888;private ServerSocket server;private int port;//绑定端口public Connector() {this(DEFAULT_PORT);}public Connector(int port) {this.port = port;}public void start() {//创建线程并启动该线程,会自动调用线程中的run方法Thread thread = new Thread(this);thread.start();}@Overridepublic void run() {try {//创建服务器socketserver = new ServerSocket(port);System.out.println("启动服务器,监听端口:" + port);//BIO式建立网络间通讯while (true) {//server.accept会阻塞直到链接成功建立Socket socket = server.accept();InputStream input = socket.getInputStream();OutputStream output = socket.getOutputStream();//创建Request并解析HTTP请求头中的uriRequest request = new Request(input);request.parse();//创建Response并绑定request以获取uriResponse response = new Response(output);response.setRequest(request);//调用process读取文件内容并输出到输出流中StaticProcessor processor = new StaticProcessor();processor.process(request, response);//及时关闭socket节省服务器资源close(socket);}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();} finally {//最后确保关闭服务器,节省资源close(server);}}private void close(Closeable closeable) {if (closeable != null) {try {closeable.close();  } catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}}
}
  • 建立了个BIO模型的网络间通讯服务器
  • 调用process将请求的文件内容输出到输出流中

实现客户端TestClient以及服务器端Bootstrap

TestClient

java">package Webserver.src.test;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;public class TestClient {public static void main(String[] args) throws UnknownHostException, IOException {//建立socket监听主机:"localhost" 端口:8888Socket socket = new Socket("localhost", 8888);OutputStream output = socket.getOutputStream();//发送HTTP请求并及时关闭输出流,节省资源output.write("GET /index.html HTTP/1.1".getBytes());socket.shutdownOutput();//读入输入中的内容并输出InputStream input = socket.getInputStream();byte [] buffer = new byte[2048];int length = input.read(buffer);StringBuilder response = new StringBuilder();for (int i = 0; i < length; i ++) {response.append((char)buffer[i]);}System.out.println(response.toString());socket.shutdownInput();//关闭socket,关闭客户端socket.close();}
}
  • 建立客户端
  • 接受客户端传入的消息并打印

Bootstrap

java">package Webserver.src;import Webserver.src.connector.Connector;public class Bootstrap {public static void main(String[] args) {Connector connector = new Connector();connector.start();}
}
  • 启动服务器端
  • 等待客户端连接和解析其发送的请求

测试结果

先后启动服务器端以及客户端
https://i-blog.csdnimg.cn/direct/6f760c5c98f241c08f5f4800d7875b76.png" alt="在这里插入图片描述" />

  • 可见成功返回200 OK的HTTP响应头和请求的文件内容

启动服务器端并在web浏览器上发送请求

  1. 发送http://localhost:8888/index.html请求

https://i-blog.csdnimg.cn/direct/966581ad7e9342809d13826d209edc3c.png" alt="在这里插入图片描述" />
成功返回对应的网页内容

  1. 发送不合法的请求

https://i-blog.csdnimg.cn/direct/fd822d0d94b94738b1f443e5f08d4e89.png" alt="在这里插入图片描述" />

成功返回File not found的网页内容


http://www.ppmy.cn/server/146587.html

相关文章

rest-assured multiPart上传中文名称文件,文件名乱码

rest-assured是一个基于java语言的REST API测试框架&#xff0c;在使用rest-assured的multipart 上传文件后&#xff0c;后端获取的文件名称乱码。截图如下&#xff1a; 原因是rest-assured multipart/form-data默认的编码格式是US-ASCII&#xff0c;需要设置为UTF-8。 Befo…

使用JdbcTemplate 结合预编译预计批量插入数据

使用JdbcTemplate 结合预编译预计批量插入数 1. 方法功能概述2. 代码详细分析2.1 预编译语句设置器&#xff08;BatchPreparedStatementSetter&#xff09;2.2 数据插入操作 3. 整体总结 使用JdbcTemplate 结合预编译预计批量插入数据 1. 方法功能概述 它通过使用预编译语句&a…

数据结构-排序

排序的基本概念 把一堆数据元素按照它们的关键字递增或者递减的顺序把它们重新给排列一遍 排序算法执行可视化网站 插入排序 所有的辅助变量所需要的空间都是常数级的&#xff0c;和问题规模n没有关系 之前设计的折半查找的规则&#xff0c;当我们找到一个和目标关键字相同的…

Spring,SpringMVC,SpringBoot,SpringCloud有什么区别和联系?

简单介绍&#xff1a; Spring 乃是一个轻量级的控制反转&#xff08;IoC&#xff09;与面向切面&#xff08;AOP&#xff09;的容器框架。Spring 能够助力您编写出更为纯净、更具可管理性且更易于测试的代码。 Spring MVC 系 Spring 的一个模块&#xff0c;亦为一个网络框架。…

Spark SQL大数据分析快速上手-完全分布模式安装

【图书介绍】《Spark SQL大数据分析快速上手》-CSDN博客 《Spark SQL大数据分析快速上手》【摘要 书评 试读】- 京东图书 大数据与数据分析_夏天又到了的博客-CSDN博客 Hadoop完全分布式环境搭建步骤-CSDN博客,前置环境安装参看此博文 完全分布模式也叫集群模式。将Spark目…

Easyexcel(7-自定义样式)

相关文章链接 Easyexcel&#xff08;1-注解使用&#xff09;Easyexcel&#xff08;2-文件读取&#xff09;Easyexcel&#xff08;3-文件导出&#xff09;Easyexcel&#xff08;4-模板文件&#xff09;Easyexcel&#xff08;5-自定义列宽&#xff09;Easyexcel&#xff08;6-单…

GPT(Generative Pre-trained Transformer) 和 Transformer的比较

GPT&#xff08;Generative Pre-trained Transformer&#xff09; 和 Transformer 的比较 flyfish 1. Transformer 是一种模型架构 Transformer 是一种通用的神经网络架构&#xff0c;由 Vaswani 等人在论文 “Attention Is All You Need”&#xff08;2017&#xff09;中提…

YOLO模型训练后的best.pt和last.pt区别

在选择YOLO模型训练后的权重文件best.pt和last.pt时&#xff0c;主要取决于具体的应用场景‌&#xff1a;‌12 ‌best.pt‌&#xff1a;这个文件保存的是在训练过程中表现最好的模型权重。通常用于推理和部署阶段&#xff0c;因为它包含了在验证集上表现最好的模型权重&#x…