山寨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

相关文章

NFS实现多服务器文件的共享的方法步骤

《NFS实现多服务器文件的共享的方法步骤》NFS允许网络中的计算机之间共享资源,客户端可以透明地读写远端NFS服务器上的文件,本文就来介绍一下NFS实现多服务器文件的共享的方法步骤,感兴趣的可以了解一... 目录一、简介二、部署1、准备1、服务端和客户端:安装nfs-utils2、服务端:创建共享目录3、服

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

使用IntelliJ IDEA创建简单的Java Web项目完整步骤

《使用IntelliJIDEA创建简单的JavaWeb项目完整步骤》:本文主要介绍如何使用IntelliJIDEA创建一个简单的JavaWeb项目,实现登录、注册和查看用户列表功能,使用Se... 目录前置准备项目功能实现步骤1. 创建项目2. 配置 Tomcat3. 项目文件结构4. 创建数据库和表5.

Python项目打包部署到服务器的实现

《Python项目打包部署到服务器的实现》本文主要介绍了PyCharm和Ubuntu服务器部署Python项目,包括打包、上传、安装和设置自启动服务的步骤,具有一定的参考价值,感兴趣的可以了解一下... 目录一、准备工作二、项目打包三、部署到服务器四、设置服务自启动一、准备工作开发环境:本文以PyChar

Apache Tomcat服务器版本号隐藏的几种方法

《ApacheTomcat服务器版本号隐藏的几种方法》本文主要介绍了ApacheTomcat服务器版本号隐藏的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1. 隐藏HTTP响应头中的Server信息编辑 server.XML 文件2. 修China编程改错误

如何在一台服务器上使用docker运行kafka集群

《如何在一台服务器上使用docker运行kafka集群》文章详细介绍了如何在一台服务器上使用Docker运行Kafka集群,包括拉取镜像、创建网络、启动Kafka容器、检查运行状态、编写启动和关闭脚本... 目录1.拉取镜像2.创建集群之间通信的网络3.将zookeeper加入到网络中4.启动kafka集群

Python如何实现 HTTP echo 服务器

《Python如何实现HTTPecho服务器》本文介绍了如何使用Python实现一个简单的HTTPecho服务器,该服务器支持GET和POST请求,并返回JSON格式的响应,GET请求返回请求路... 一个用来做测试的简单的 HTTP echo 服务器。from http.server import HT

手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

《手把手教你idea中创建一个javaweb(webapp)项目详细图文教程》:本文主要介绍如何使用IntelliJIDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建... 1.启动idea2.创建项目模板点击项目-新建项目-选择maven,显示如下页面输入项目名称,选择

如何安装 Ubuntu 24.04 LTS 桌面版或服务器? Ubuntu安装指南

《如何安装Ubuntu24.04LTS桌面版或服务器?Ubuntu安装指南》对于我们程序员来说,有一个好用的操作系统、好的编程环境也是很重要,如何安装Ubuntu24.04LTS桌面... Ubuntu 24.04 LTS,代号 Noble NumBAT,于 2024 年 4 月 25 日正式发布,引入了众

如何提高Redis服务器的最大打开文件数限制

《如何提高Redis服务器的最大打开文件数限制》文章讨论了如何提高Redis服务器的最大打开文件数限制,以支持高并发服务,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录如何提高Redis服务器的最大打开文件数限制问题诊断解决步骤1. 修改系统级别的限制2. 为Redis进程特别设置限制