WEB服务器原理与示例

Web 服务器是一种软件,负责处理 HTTP 请求并向客户端发送响应,常见的 Web 服务器有 Apache、Nginx 和 IIS。
  客户端请求 Web 服务器主要是为了获取资源或执行操作,这一请求-响应模型是 Web 运作的基础,涉及 HTTP 协议、请求-响应模型和 TCP/IP 协议。
  当客户端发送 HTTP 请求时,Web 服务器根据请求的 URL 或文件扩展名决定如何处理请求。
  对于静态资源,服务器直接返回文件内容;
  对于动态脚本,服务器会将请求转发给相应语言的解释器(如 PHP、Python、Ruby),处理后再将结果返回给客户端。
  如果启用了负载均衡,服务器会将请求分发给后端服务器并返回响应。
  此外,Web 服务器还可实施 SSL/TLS 加密、访问控制和反向代理等安全措施,以保护 Web 应用和数据。
    静态资源:
      客户端需要获取 Web 服务器上的静态资源,如 HTML 页面、图片、CSS 文件、JavaScript 文件等。
    动态资源:
      客户端需要获取由服务器端脚本(如 PHP、Node.js、Python 等)生成的动态内容,如动态生成的 HTML 页面、JSON 数据等。

客户端向 Web 服务器发送请求的过程如下:

  1.客户端(如浏览器)与 Web 服务器的 HTTP 端口(默认80)建立 TCP 连接。
  2.通过这个连接,客户端发送 HTTP 请求,包括 URL、请求方法(如 GET、POST)和请求头。
  3.服务器解析请求行和头部信息,提取请求方法和 URL,并处理服务器上的静态资源或动态内容。

Web 服务器的主要功能包括:
  1.分发静态资源:处理 HTML、CSS、JS、图片等静态资源,提升访问速度,节省服务器资源。
  2.执行动态脚本:与动态脚本语言集成,生成动态内容并返回给客户端,实现个性化体验。
  3.负载均衡:将请求分发到多个后端服务器,提高可用性和性能。
  4.安全性:实施 SSL/TLS 加密、访问控制等措施,确保 Web 应用程序和数据的安全。

 
 
■代码示例
  1 import java.io.BufferedReader;  
  2 import java.io.File;  
  3 import java.io.FileInputStream;  
  4 import java.io.FileReader;  
  5 import java.io.IOException;  
  6 import java.io.InputStream;  
  7 import java.io.InputStreamReader;  
  8 import java.io.OutputStream;  
  9 import java.net.ServerSocket;  
 10 import java.net.Socket;  
 11 
 12 public class SimpleWebServer {  
 13     public static void main(String[] args) {  
 14     //private static final String IMAGE_DIRECTORY = "path/to/your/images"; // 设置指定的图片目录  
 15         int port = 8080; // 监听的端口  
 16         try (ServerSocket serverSocket = new ServerSocket(port)) {  
 17             System.out.println("简易Web服务器已启动,正在监听端口 " + port + " ...");  
 18             //创建一个 ServerSocket 对象 serverSocket,在指定的端口(8080)上监听客户端请求。
 19             while (true) {  
 20                 try (Socket clientSocket = serverSocket.accept()) {  
 21                     // 处理客户端请求  
 22                     handleClient(clientSocket);  
 23                 } catch (IOException e) {  
 24                     System.err.println("客户端连接处理失败: " + e.getMessage());  
 25                 }  
 26             }  
 27             //服务器持续运行,使用 serverSocket.accept() 等待并接受客户端连接。
 28             //一旦接受连接,调用 handleClient(clientSocket) 方法来处理该请求。
 29         } catch (IOException e) {  
 30             System.err.println("无法启动服务器: " + e.getMessage());  
 31         }  
 32     }  
 33 
 34     private static void handleClient(Socket clientSocket) throws IOException {  
 35         BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));  
 36         OutputStream outputStream = clientSocket.getOutputStream();  
 37         //在 handleClient 方法中,创建 BufferedReader 用于读取客户端输入流,创建 OutputStream 用于响应客户端。
 38         
 39         // 读取HTTP请求  
 40         String requestLine = reader.readLine();  
 41         if (requestLine != null && !requestLine.isEmpty()) {  
 42             System.out.println("请求: " + requestLine);  
 43             //读取客户端发送的请求行并打印。请求通常包括HTTP方法、路径和协议版本。
 44 
 45             // 解析请求的文件路径  
 46             String[] requestParts = requestLine.split(" ");  
 47             String requestedFile = requestParts[1].equals("/") ? "index.html" : requestParts[1].substring(1); // 默认返回index.html  
 48 
 49             File file = new File(requestedFile);  
 50             if (file.exists() && !file.isDirectory()) {  
 51                 // 获取文件类型  
 52                 String contentType = getContentType(requestedFile);  
 53                 // 返回文件内容  
 54                 sendResponse(outputStream, "HTTP/1.1 200 OK", contentType, new FileInputStream(file));  
 55             } else {  
 56                 // 文件未找到时返回404  
 57                 String httpResponse = "HTTP/1.1 404 Not Found\r\n" +  
 58                                       "Content-Type: text/html\r\n" +  
 59                                       "Connection: close\r\n\r\n" +  
 60                                       "<html><body><h1>404 - 文件未找到</h1></body></html>";  
 61                 outputStream.write(httpResponse.getBytes("UTF-8"));  
 62                 outputStream.flush();  
 63             }  
 64         }  
 65 
 66         // 关闭连接  
 67         outputStream.close();  
 68         reader.close();  
 69     }  
 70 
 71     private static void sendResponse(OutputStream outputStream, String statusLine, String contentType, InputStream fileInputStream) throws IOException {  
 72         outputStream.write((statusLine + "\r\n").getBytes("UTF-8"));  
 73         outputStream.write(("Content-Type: " + contentType + "\r\n").getBytes("UTF-8"));  
 74         outputStream.write("Connection: close\r\n\r\n".getBytes("UTF-8")); 
 75         //创建 sendResponse 方法,负责构建和发送HTTP响应,包括状态行和内容类型。        
 76 
 77         // 读取文件输入流并写入输出流  
 78         byte[] buffer = new byte[1024];  
 79         int bytesRead;  
 80         while ((bytesRead = fileInputStream.read(buffer)) != -1) {  
 81             outputStream.write(buffer, 0, bytesRead);  
 82         }  
 83         outputStream.flush(); // 确保所有数据都被发送  
 84         fileInputStream.close(); // 关闭文件输入流  
 85     }  
 86 
 87     private static String getContentType(String fileName) {  
 88         if (fileName.endsWith(".html") || fileName.endsWith(".htm")) {  
 89             return "text/html";  
 90         } else if (fileName.endsWith(".jpg") || fileName.endsWith(".jpeg")) {  
 91             return "image/jpeg";  
 92         } else if (fileName.endsWith(".png")) {  
 93             return "image/png";  
 94         } else if (fileName.endsWith(".gif")) {  
 95             return "image/gif";  
 96         } else {  
 97             return "application/octet-stream"; // 默认内容类型  
 98         }  
 99     }  
100 }  
简易WEB服务器代码示例
 
 1 <!DOCTYPE html>  
 2 <html lang="zh">  
 3 <head>  
 4     <meta charset="UTF-8">  
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">  
 6     <title>欢迎</title>  
 7 </head>  
 8 <body>  
 9     <h1>欢迎访问我的简易Web服务器!</h1>  
10     <p>这是一个返回 `index.html` 内容的示例。</p>  
11     <img src="example.jpg" alt="示例图片" />  
12 </body>  
13 </html>  
HTML代码示例
 
访问页面:
  打开浏览器并访问 http://localhost:8080,可以看到 index.html 的内容,并且能显示图片。
访问图片:
  打开浏览器并访问 http://localhost:8080/your-image-file.jpg,在浏览器内能显示图片。
posted @ 2024-12-18 15:01  HappyBeibei  阅读(6)  评论(0编辑  收藏  举报