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

相关文章

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

一文教你如何将maven项目转成web项目

《一文教你如何将maven项目转成web项目》在软件开发过程中,有时我们需要将一个普通的Maven项目转换为Web项目,以便能够部署到Web容器中运行,本文将详细介绍如何通过简单的步骤完成这一转换过程... 目录准备工作步骤一:修改​​pom.XML​​1.1 添加​​packaging​​标签1.2 添加

CentOS 7部署主域名服务器 DNS的方法

《CentOS7部署主域名服务器DNS的方法》文章详细介绍了在CentOS7上部署主域名服务器DNS的步骤,包括安装BIND服务、配置DNS服务、添加域名区域、创建区域文件、配置反向解析、检查配置... 目录1. 安装 BIND 服务和工具2.  配置 BIND 服务3 . 添加你的域名区域配置4.创建区域

Windows Server服务器上配置FileZilla后,FTP连接不上?

《WindowsServer服务器上配置FileZilla后,FTP连接不上?》WindowsServer服务器上配置FileZilla后,FTP连接错误和操作超时的问题,应该如何解决?首先,通过... 目录在Windohttp://www.chinasem.cnws防火墙开启的情况下,遇到的错误如下:无法与

Windows server服务器使用blat命令行发送邮件

《Windowsserver服务器使用blat命令行发送邮件》在linux平台的命令行下可以使用mail命令来发送邮件,windows平台没有内置的命令,但可以使用开源的blat,其官方主页为ht... 目录下载blatBAT命令行示例备注总结在linux平台的命令行下可以使用mail命令来发送邮件,Win

web网络安全之跨站脚本攻击(XSS)详解

《web网络安全之跨站脚本攻击(XSS)详解》:本文主要介绍web网络安全之跨站脚本攻击(XSS)的相关资料,跨站脚本攻击XSS是一种常见的Web安全漏洞,攻击者通过注入恶意脚本诱使用户执行,可能... 目录前言XSS 的类型1. 存储型 XSS(Stored XSS)示例:危害:2. 反射型 XSS(Re

Ubuntu 22.04 服务器安装部署(nginx+postgresql)

《Ubuntu22.04服务器安装部署(nginx+postgresql)》Ubuntu22.04LTS是迄今为止最好的Ubuntu版本之一,很多linux的应用服务器都是选择的这个版本... 目录是什么让 Ubuntu 22.04 LTS 变得安全?更新了安全包linux 内核改进一、部署环境二、安装系统

nginx配置多域名共用服务器80端口

《nginx配置多域名共用服务器80端口》本文主要介绍了配置Nginx.conf文件,使得同一台服务器上的服务程序能够根据域名分发到相应的端口进行处理,从而实现用户通过abc.com或xyz.com直... 多个域名,比如两个域名,这两个域名其实共用一台服务器(意味着域名解析到同一个IP),一个域名为abc

pycharm远程连接服务器运行pytorch的过程详解

《pycharm远程连接服务器运行pytorch的过程详解》:本文主要介绍在Linux环境下使用Anaconda管理不同版本的Python环境,并通过PyCharm远程连接服务器来运行PyTorc... 目录linux部署pytorch背景介绍Anaconda安装Linux安装pytorch虚拟环境安装cu