首页 > 其他分享 >第一章:实现基础 HTTP 服务器-MiniTomcat系列

第一章:实现基础 HTTP 服务器-MiniTomcat系列

时间:2024-11-09 14:20:26浏览次数:3  
标签:HTTP MiniTomcat writer ServerSocket println 服务器 客户端

上一章内容 MiniTomcat 项目大纲

<iframe allowfullscreen="true" data-mediaembed="bilibili" frameborder="0" id="cfenL0XX-1731133747252" src="https://player.bilibili.com/player.html?aid=113447417151728"></iframe>

第一章:实现基础 HTTP 服务器-MiniTomcat系列

在这一章中,我们将从零开始编写一个简单的 HTTP 服务器。这个服务器的基本功能是监听一个端口,接收来自客户端的 HTTP 请求,并返回一个 HTTP 响应。我们将使用 Java 的 ServerSocket 类来实现网络监听,并通过简单的 InputStreamOutputStream 来处理 HTTP 请求和响应。

1.1 创建基础 HTTP 服务器

我们的目标是创建一个能够监听客户端请求的 HTTP 服务器,并能返回一个简单的响应。我们将分为几个步骤:

  1. 创建一个 ServerSocket 监听端口:使用 ServerSocket 类来创建一个监听指定端口的服务器套接字。

  2. 接受客户端连接并接收请求:通过 Socket 接受客户端的连接,并从输入流读取 HTTP 请求。

  3. 发送 HTTP 响应:构建一个简单的 HTTP 响应并通过输出流发送给客户端。

1.2 实现代码
import java.io.*;
import java.net.*;

public class SimpleHttpServer {
    private static final int PORT = 8080;

    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(PORT)) {
            System.out.println("HTTP Server is running on port " + PORT);

            while (true) {
                // 接受客户端连接
                Socket clientSocket = serverSocket.accept();
                System.out.println("New connection from " + clientSocket.getInetAddress());

                // 获取输入流,读取客户端请求
                InputStream inputStream = clientSocket.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
                String requestLine = reader.readLine();
                if (requestLine != null) {
                    System.out.println("Request: " + requestLine);
                }

                // 构建一个简单的 HTTP 响应
                OutputStream outputStream = clientSocket.getOutputStream();
                PrintWriter writer = new PrintWriter(outputStream, true);
                writer.println("HTTP/1.1 200 OK");
                writer.println("Content-Type: text/html; charset=UTF-8");
                writer.println();  // 空行,表示响应头结束
                writer.println("<html>");
                writer.println("<head><title>Simple HTTP Server</title></head>");
                writer.println("<body><h1>Hello, World!</h1></body>");
                writer.println("</html>");

                // 关闭连接
                clientSocket.close();
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
1.3 代码解析
  1. 创建 ServerSocket 实例

    ServerSocket serverSocket = new ServerSocket(PORT);

    这行代码创建了一个监听指定端口(本例为 8080)的 ServerSocket 实例。ServerSocket 是 Java 提供的一个用于监听客户端连接的类。

  2. 接受客户端连接

    Socket clientSocket = serverSocket.accept();

    通过调用 accept() 方法,服务器会阻塞并等待来自客户端的连接。一旦有客户端连接到服务器,就会返回一个 Socket 对象,代表与该客户端的连接。

  3. 读取 HTTP 请求

    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
    String requestLine = reader.readLine();

    通过输入流,我们从客户端读取 HTTP 请求的第一行(请求行),例如 GET / HTTP/1.1。这是 HTTP 请求的最基础信息,包含了请求方法、路径和 HTTP 版本。

  4. 发送 HTTP 响应

    PrintWriter writer = new PrintWriter(outputStream, true);
    writer.println("HTTP/1.1 200 OK");
    writer.println("Content-Type: text/html; charset=UTF-8");
    writer.println();
    writer.println("<html>");
    writer.println("<head><title>Simple HTTP Server</title></head>");
    writer.println("<body><h1>Hello, World!</h1></body>");
    writer.println("</html>");

    构建一个简单的 HTTP 响应,响应内容为一个 HTML 页面,显示 "Hello, World!"。首先,我们发送 HTTP 响应的状态行,紧接着发送响应头(如 Content-Type)。响应体部分包含了一个简单的 HTML 页面。

  5. 关闭连接

    clientSocket.close();

    每次处理完一个请求后,我们关闭与客户端的连接。

1.4 测试 HTTP 服务器
  1. 编译并运行 SimpleHttpServer 类。

  2. 在浏览器中访问 http://localhost:8080,你应该会看到一个显示 "Hello, World!" 的网页。

  3. 你也可以使用 curl 命令来测试服务器:

    curl http://localhost:8080
1.5 总结

通过这一章,我们实现了一个非常简单的 HTTP 服务器,能够监听来自客户端的请求,并返回一个静态的 HTML 页面。这个 HTTP 服务器只是一个最基本的框架,但它为我们后续增加更多功能(如静态文件支持、Servlet 容器等)奠定了基础。

在下一章,我们将开始解析 HTTP 请求,并支持静态文件的提供。

项目源代码地址:

https://github.com/daichangya/MiniTomcat/tree/chapter1/mini-tomcat

标签:HTTP,MiniTomcat,writer,ServerSocket,println,服务器,客户端
From: https://blog.csdn.net/novelly/article/details/143644266

相关文章

  • Web缓存中毒(Web Cache Poisoning)是一种网络攻击技术,攻击者通过篡改或伪造Web服务器的
    Web缓存中毒(WebCachePoisoning)是一种网络攻击技术,攻击者通过篡改或伪造Web服务器的缓存内容,使得用户在访问网站时,获得恶意内容或错误内容的攻击方式。这种攻击通常依赖于利用Web缓存的设计缺陷或未充分验证的请求参数,从而让缓存服务器存储并返回恶意的、篡改过的响应。工作原理......
  • fabric服务器选择xshell连接
    前置工具Xshell云服务器选择aliyun.com注意:可以免费使用三个月,这里不做介绍,下图是按量付费Xshell连接创建密钥对完成密钥对的绑定ssh<你的服务器公网ip>登录连接成功如何使用password登录前置:需要将上文的操作完成vi/etc/ssh/sshd_config(连接......
  • 【RocketMQ】无法访问此网站 http://XXX:10080/ ERR_UNSAFE_PORT
    安装完rocketmq-dashboard。打开浏览器访问地址。问题提示:无法访问此网站网址为 http://192.168.22.197:10080/ 的网页可能暂时无法连接,或者它已永久性地移动到了新网址。ERR_UNSAFE_PORT‌无法访问10080端口的网站通常是由于Chrome浏览器的安全机制导致的。‌Chrome......
  • HTTPS协议
    HTTPS一、介绍二、HTTP中间人攻击1、介绍2、下载示例三、相关概念1、密钥2、加密3、解密4、数据摘要(1)介绍(2)特点5、数字签名(1)介绍(2)实现步骤(3)示意图四、对称加密1、介绍2、特点3、缺点五、非对称加密1、介绍2、优点3、缺点六、CA证书1、介绍2、功能3、CA认证4、示意......
  • 听说你的轻量服务器在吃灰?来看看这些技巧
    刚从校园踏入社会的时候,我也有过一股热情,迫不及待地购买了一台服务器,心想拥有自己的服务器一定非常酷。然而,现实总是充满挑战,工作中的大部分时间都被用来修复各种bug,而自己在服务器管理方面的知识和经验又相当匮乏,导致这台服务器几乎成了摆设,整整一年都没有得到充分利用,最终......
  • 双十一购买服务器不止局限于新用户,老用户同样有福利!
    双十一购物狂欢节已经正式开启,正如预期,各大云厂商纷纷大规模投放服务器资源,掀起了一波价格战,服务器价格已经降到前所未有的低点!不仅如此,各种丰厚的福利和优惠活动也陆续上线,让你享受更多的实惠和便利。为了帮助大家在这个特殊的时段内更加明智地购买服务器,今天我将以腾讯云......
  • Python 临时启动简单的 HTTP 服务器
    需要临时启动一个简单的WebServer进行测试或分享文件,当然可以用Apache、Nginx这些HTTP服务,不过又显得过于麻烦。 Python自带了一个简单的内建HTTP服务器,这时候用它就特别合适了!基本命令```python-mWeb服务器模块[端口号,默认8000]```这里的“Web服务器模块”......
  • 服务器CPU是多核的情况下,Linux Top 命令计算进程CPU使用率为什么要乘以CPU逻辑核数
    服务器CPU是多核的情况下,LinuxTop命令计算进程CPU使用率为什么要乘以CPU逻辑核数  在多核服务器上,top命令计算进程的CPU使用率时,乘以的是CPU的逻辑核数(LogicalCPUs),而不是物理核数。逻辑核数与物理核数的区别物理核数:指物理CPU中实际存在的核心数量。例如,如果......
  • 腾讯云CVM云服务器最佳实践
    引言在数字化时代,云计算已成为企业和个人用户部署应用、存储数据、处理信息的首选方案,其高效、灵活、可扩展的特性极大地促进了业务的快速发展,那么如何正确地购买、配置、管理云服务器,以确保其安全稳定运行呢?本文将以腾讯云CVM云服务器的最佳实践为例,说明从购买到初始化设......
  • CPSC 471 HTTP protocol
    CPSC471-05AssignmentIntroductionAttheheartofthecommunicationinvolvingabrowserandaserver,RFC2616definesthefundamentalprotocolthatgovernsinteractionsbetweeninternetdevices.TheresultwasknownastheHTTPprotocol.Inthisassign......