山寨web服务器

2024-05-23 09:08
文章标签 服务器 web 山寨

本文主要是介绍山寨web服务器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这是及其简单的web服务器,只实现从请求到处理请求的过程。基本架构如下

这里写图片描述

主程序:使用socket监听端口,等待用户连接,一旦有用户连接,创建一个线程放入线程池。代码如下:

package com.web.tomdog;import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class Tomdog {public static void main(String[] args) {new Tomdog().start();}/*** 启动服务器*/public void start(){try {//启动服务ServerSocket ss = new ServerSocket(Properties.PORT);System.out.println("服务器启动....端口:"+Properties.PORT);while(true){//等待连接Socket socket = ss.accept();//一旦有连接,使用并发量100的线程池处理请求ExecutorService pool = Executors.newFixedThreadPool(100);pool.submit(new RequestHandlerThread(socket));}} catch (IOException e) {e.printStackTrace();}}}

处理请求的线程:使用IO流,读取用户想要访问的资源,然后输出给用户

package com.web.tomdog;import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;public class RequestHandlerThread implements Runnable{private HttpRequest request = null;private HttpResponse response = null;public RequestHandlerThread(Socket socket) {request = new HttpRequest(socket);response = new HttpResponse(socket);}@Overridepublic void run() {String url = request.getRequestUrl();File file = new File(Properties.WEB_ROOT+url);PrintStream out = response.getWriter();if (file.exists()) {try {//根据用户请求的路径,读取文件byte[] bs = new byte[(int)file.length()];BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));bis.read(bs);//将文件输出给用户//使用println输出状态,使用write输出内容out.println(Properties.STATUS_200);//必须换行,否则浏览器无法解析out.println();out.write(bs);out.flush();out.close();} catch (IOException e) {e.printStackTrace();}}else{//找不到资源,返回404out.println(Properties.STATUS_404);out.println();try {out.write("<h1>404 ERROR...</h1>".getBytes());out.flush();out.close();} catch (IOException e) {e.printStackTrace();}}}}

封装request和response

package com.web.tomdog;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;public class HttpRequest {private InputStream in = null;private String requestUrl;public HttpRequest(Socket socket) {try {in = socket.getInputStream();this.requestUrl = parseRequestUrl();} catch (IOException e) {e.printStackTrace();}}public String getRequestUrl(){return this.requestUrl;}/*** 解析请求信息,得到访问路径* @return*/private String parseRequestUrl(){BufferedReader reader = new BufferedReader(new InputStreamReader(in));String url = "";try {String head = reader.readLine();System.out.println(head);if (head != null) {url = head.split(" ")[1];}} catch (IOException e) {e.printStackTrace();}if(url.equals("/")){url = Properties.INDEX;}return url;}}
package com.web.tomdog;import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;public class HttpResponse {private PrintStream out = null;public HttpResponse(Socket socket){try {out = new PrintStream(socket.getOutputStream());} catch (IOException e) {e.printStackTrace();}}public PrintStream getWriter(){return out;}
}

自定义Properties类来替代读取配置文件的过程

package com.web.tomdog;import java.io.File;
/*** 服务器配置信息(实际上应该从配置文件读取)* @author 周**/
public class Properties {/*** 默认端口号*/public static final int PORT = 8080;/*** web资源文件根目录,相当于tomcat的webapps,此处指定为D:\webapps\*/public static final String WEB_ROOT = "D:"+File.separator+"webapps"+File.separator;/*** 默认页面,当访问/路径时,即访问index.html*/public static final String INDEX = "/index.html";/*** 状态码200*/public static final String STATUS_200 = "HTTP/1.1 200 OK";/*** 状态码404*/public static final String STATUS_404 = "HTTP/1.1 404 NOT FOUND";
}

在Properties 中定义的WEB_ROOT目录下,放一些图片,文本,html,使用localhost:8080/xxx访问试试看

这里写图片描述

这里写图片描述

这篇关于山寨web服务器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/996217

相关文章

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

Linux搭建ftp服务器的步骤

《Linux搭建ftp服务器的步骤》本文给大家分享Linux搭建ftp服务器的步骤,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录ftp搭建1:下载vsftpd工具2:下载客户端工具3:进入配置文件目录vsftpd.conf配置文件4:

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

Linux查询服务器 IP 地址的命令详解

《Linux查询服务器IP地址的命令详解》在服务器管理和网络运维中,快速准确地获取服务器的IP地址是一项基本但至关重要的技能,下面我们来看看Linux中查询服务器IP的相关命令使用吧... 目录一、hostname 命令:简单高效的 IP 查询工具命令详解实际应用技巧注意事项二、ip 命令:新一代网络配置全

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

Linux查询服务器系统版本号的多种方法

《Linux查询服务器系统版本号的多种方法》在Linux系统管理和维护工作中,了解当前操作系统的版本信息是最基础也是最重要的操作之一,系统版本不仅关系到软件兼容性、安全更新策略,还直接影响到故障排查和... 目录一、引言:系统版本查询的重要性二、基础命令解析:cat /etc/Centos-release详

Python WSGI HTTP服务器Gunicorn使用详解

《PythonWSGIHTTP服务器Gunicorn使用详解》Gunicorn是Python的WSGI服务器,用于部署Flask/Django应用,性能高且稳定,支持多Worker类型与配置,可处... 目录一、什么是 Gunicorn?二、为什么需要Gunicorn?三、安装Gunicorn四、基本使用启

通过配置nginx访问服务器静态资源的过程

《通过配置nginx访问服务器静态资源的过程》文章介绍了图片存储路径设置、Nginx服务器配置及通过http://192.168.206.170:8007/a.png访问图片的方法,涵盖图片管理与服务... 目录1.图片存储路径2.nginx配置3.访问图片方式总结1.图片存储路径2.nginx配置

Python极速搭建局域网文件共享服务器完整指南

《Python极速搭建局域网文件共享服务器完整指南》在办公室或家庭局域网中快速共享文件时,许多人会选择第三方工具或云存储服务,但这些方案往往存在隐私泄露风险或需要复杂配置,下面我们就来看看如何使用Py... 目录一、android基础版:HTTP文件共享的魔法命令1. 一行代码启动HTTP服务器2. 关键参

Python Web框架Flask、Streamlit、FastAPI示例详解

《PythonWeb框架Flask、Streamlit、FastAPI示例详解》本文对比分析了Flask、Streamlit和FastAPI三大PythonWeb框架:Flask轻量灵活适合传统应用... 目录概述Flask详解Flask简介安装和基础配置核心概念路由和视图模板系统数据库集成实际示例Stre