# webserver **Repository Path**: codelife1224/webserver ## Basic Information - **Project Name**: webserver - **Description**: 手写web服务器 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-12-27 - **Last Updated**: 2023-12-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # WebServer ## Web原理 ### Web概述 > Web是指互联网上的万维网(World Wide Web),是一个由`超文本`、·超链接`和·多媒体`内容组成的信息空间 - 基于客户端-服务器模型(B/S)架构 - 被广泛应用于信息检索、在线购物、社交媒体、在线游戏、在线视频和音乐等领域 ### 应用领域 - 全球范围的信息共享 - 便利的在线服务 - 多媒体内容的呈现 - 云计算 - Web应用程序 - 等等。。。 ## Web工作原理 ### 基本组成 > 核心有:WEB服务器、WEB客户端、通信协议 - WEB服务器接收HTTP请求、查找并生成响应,并将其发送回浏览器 - 浏览器读取响应并将其转换成可视化的Web页面 ![Web工作原理](./note_images/img.png) ### Web服务器 - 一个可以接收客户端请求的软件程序 - 运行在提供Web服务的主机,主机上存储Web资源 - 服务器接收客户端请求,并返回请求的资源 ### Web客户端 - 通过浏览器访问Web的用户设备,如电脑、手机等 ### HTTP协议 - 一种客户端-服务器协议,用于传输超文本文档(HTML、XML、图片等等) ### HTML - 创建Web页面的标记语言 ## 手写WebServer ### HTTP协议 > HTTP,全程`Hypertext Transfer Protocol` - 一种`应用层`协议,用于在Web浏览器和Web服务器之间传输数据 - 定义了客户端和服务器之间的通信规则 - 使得Web可以是实现信息的交互和共享 > HTTP协议的优势 - 简单易用 - 可扩展 - 无状态:不保存任何关于请求或响应的状态信息,这使得Web服务器可以处理大量请求 - 可靠性:确保数据在客户端和服务器之间的安全传输,支持数据压缩、数据加密等技术 🤔**经典面试题:HTTP协议工作原理** ![HTTP协议工作原理](./note_images/HTTP协议工作原理.png) > > 1. 建立连接 > - 客户端向服务器发送一个请求连接到服务器 > - 客户端可以通过TCP/IP协议连接 > 2. 发送请求 > - 客户端向服务器发送HTTP请求,请求包括请求方法、请求头、请求体等信息 > 3. 处理请求 > - 服务器接收到HTTP请求后,根据请求的方法和URL等信息进行处理 > 4. 发送响应 > - 服务器向客户端发送HTTP响应,相应包括响应状态码、响应头、响应体等信息 > 5. 关闭连接 > - 一旦HTTP响应发送完毕,服务器和客户端都可以选择关闭连接。 **WebServer的处理步骤** 1. 创建一个ServerSocket对象 - ServerSocket对象用于监听指定的端口,并接收客户端的请求 2. 等待客户端连接 - ServerSocket的accept()方法,等待客户端的连接请求,并返回一个Socket对象 3. 解析HTTP请求 - 从Socket对象中读取客户端的请求数据,并将其解析为HTTP请求 4. 处理HTTP请求 - 根据HTTP请求中的方法、路径和参数等信息,处理客户端的请求,并生成HTTP响应 5. 发送HTTP响应 - 将HTTP响应发送回客户端,并关闭Socket连接 ## 接收HTTP请求 ### HTTP请求结构 **请求行** - HTTP请求报文的第一行,包括HTTP方法,请求URI和HTTP版本 **请求头** - 紧随请求行之后,以一或多个冒号分割的键值对形式提供附加信息 **请求体** - HTTP请求报文的**可选部分**,通常在使用POST或PUT方法提交表单数据时出现。 ![HTTP请求报文格式](./note_images/HTTP请求报文格式.png) ### 接收HTTP请求 1. 创建ServerSocket对象,并指定监听的端口号8080 2. 使用accept()方法等待客户端的连接请求,并获取客户端的Socket对象 3. 从客户端Socket对象中获取输入流、通过`I/O流`获取HTTP请求报文