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

相关文章

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块

解决JavaWeb-file.isDirectory()遇到的坑问题

《解决JavaWeb-file.isDirectory()遇到的坑问题》JavaWeb开发中,使用`file.isDirectory()`判断路径是否为文件夹时,需要特别注意:该方法只能判断已存在的文... 目录Jahttp://www.chinasem.cnvaWeb-file.isDirectory()遇

JavaWeb-WebSocket浏览器服务器双向通信方式

《JavaWeb-WebSocket浏览器服务器双向通信方式》文章介绍了WebSocket协议的工作原理和应用场景,包括与HTTP的对比,接着,详细介绍了如何在Java中使用WebSocket,包括配... 目录一、概述二、入门2.1 POM依赖2.2 编写配置类2.3 编写WebSocket服务2.4 浏

查询SQL Server数据库服务器IP地址的多种有效方法

《查询SQLServer数据库服务器IP地址的多种有效方法》作为数据库管理员或开发人员,了解如何查询SQLServer数据库服务器的IP地址是一项重要技能,本文将介绍几种简单而有效的方法,帮助你轻松... 目录使用T-SQL查询方法1:使用系统函数方法2:使用系统视图使用SQL Server Configu

nginx-rtmp-module构建流媒体直播服务器实战指南

《nginx-rtmp-module构建流媒体直播服务器实战指南》本文主要介绍了nginx-rtmp-module构建流媒体直播服务器实战指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. RTMP协议介绍与应用RTMP协议的原理RTMP协议的应用RTMP与现代流媒体技术的关系2

mysqld_multi在Linux服务器上运行多个MySQL实例

《mysqld_multi在Linux服务器上运行多个MySQL实例》在Linux系统上使用mysqld_multi来启动和管理多个MySQL实例是一种常见的做法,这种方式允许你在同一台机器上运行多个... 目录1. 安装mysql2. 配置文件示例配置文件3. 创建数据目录4. 启动和管理实例启动所有实例

VScode连接远程Linux服务器环境配置图文教程

《VScode连接远程Linux服务器环境配置图文教程》:本文主要介绍如何安装和配置VSCode,包括安装步骤、环境配置(如汉化包、远程SSH连接)、语言包安装(如C/C++插件)等,文中给出了详... 目录一、安装vscode二、环境配置1.中文汉化包2.安装remote-ssh,用于远程连接2.1安装2

Window Server创建2台服务器的故障转移群集的图文教程

《WindowServer创建2台服务器的故障转移群集的图文教程》本文主要介绍了在WindowsServer系统上创建一个包含两台成员服务器的故障转移群集,文中通过图文示例介绍的非常详细,对大家的... 目录一、 准备条件二、在ServerB安装故障转移群集三、在ServerC安装故障转移群集,操作与Ser