您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

简单web服务器的实现思路

时间:2019-08-15 09:17:33  来源:  作者:

回想一下一个http请求的过程,你在浏览器输入xxx.com,经过域名解析 --> 发起tcp的3次握手 --> 建立tcp连接后发起http请求 --> 服务器响应http请求,浏览器得到html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) --> 浏览器对页面进行渲染呈现给用户。

 

简单web服务器的实现思路

 

 

每一个web服务器程序都需要从网络接受http请求,然后提供http回复给请求者。http回复一般包含一个html文件,有时也可以包含纯文本文件、图像或其他类型的文件。

画外音:web服务器就是一个处理http请求的应用程序。

实现大致步骤:

  • 初始化服务端ServerSocket
  • 初始化TreadPool
  • while(true)等待客户端连接
  • <<服务器启动完成>>
  • 客户端请求
  • clientHandler处理客户端的请求
  • 线程池的线程处理handler
  • 根据输入流解析请求(解析请求行,解析消息头,解析消息正文)
  • 根据输出流创建响应对象(发送状态行信息,发送响应头信息,发送响应正文信息)
  • <<静态html处理结束>>
  • 寻找servlet 根据请求路径找到需要哪个servlet处理(选择handler)
  • 通过反射机制加载这个类
  • 实例化servlet
  • servlet处理请求(执行handler结束)
  • <<跳转html处理结束>>

一个应用程序是不是先要启动起来?main函数当然要有,init方法当然有,我们先不管高性能之类的东西,多路复用Reactor之类的,但是总的有处理并发能力吧,线程池大小默认处理器的核心数,多的也处理不过来!服务器通信归根结底都是socket通信,包括redis服务器都是底层都是socket通信。我们怎么知道http请求来了,先长轮询。

  •  
private ServerSocket server;
private ExecutorService threadPool;
public WebServer() {
 try {
 System.out.println("init server begin");
 server = new ServerSocket(8080);
 int poolSize = Runtime.getRuntime().availableProcessors();
 threadPool = newFixedThreadPool(poolSize - 1);
 System.out.println("init server end");
 } catch (Exception e) {
 e.printStackTrace();
 }
 }
public void start() {
 try {
 while (true) {
 //TODO
 }
 } catch (Exception e) {
 e.printStackTrace();
 }
}
public static void main(String[] args) {
 WebServer server = new WebServer();
 server.start();
}

http请求来了,怎么处理?当然需要有定义handler去处理。

  •  
 Socket socket = server.accept();
 ClientHandler handler = new ClientHandler(socket);
 threadPool.execute(handler);

handler处理客户端请求并完成响应:

  •  
private class ClientHandler implements Runnable {
 private Socket socket;
 public ClientHandler(Socket socket) {
 this.socket = socket;
 }
 public void run() {
 try {
 //根据输入流解析请求
 HttpRequest request= new HttpRequest(socket.getInputStream());
 //先判断用户请求的是否为后端请求
 if (ServerContext.servletMApping.containsKey(
 request.getRequestLine())
 ) {
 //通过反射机制加载这个类
 //实例化这个Servlet
 } else {
 //查看请求的该页面是否存在,存在直接跳转
 } else {
 //设置状态代码404等,跳转404页面
 }
 }
 } catch (Exception e) {
 e.printStackTrace();
 } finally {
 socket.close(); 
 }
 }

处理过来的请求当然要根据输入流解析请求,根据输出流创建响应对象。需要判断是不是后端请求,如果不是后端请求,需要找到对应的文件,设置响应头,设置响应体,返回给浏览器,找不到则返回404。如果是后端请求需要经过servlet,我们肯定需要通过请求路径找到对应的配置文件,我们配置可以放在xml里面,也可以放到map里面,通过反射机制加载某个类,然后实例化某个servlet,处理完设置请求头,设置请求体返回给客户端。

知识点:IPO模型。

一个简单的web服务器的思路已经基本有了,但是为什么springboot应用不用你单独启动服务器?springboot默认使用的是 Tomcat 作为内嵌的服务器。所以,我们搭建一个工程将会变得非常的简单。springboot应用会自动启动一个嵌入的Tomcat服务器实例,至于怎么做到自动的,你问过自己为什么吗?



Tags:web服务器   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
1. 实验说明:前面的章节我们已经简单学习了windows server2019上如何搭建web服务器的,有的同学可能在上网的过程中会发现有些域名是使用的http访问而有的域名则是使用https加...【详细内容】
2021-07-07  Tags: web服务器  点击:(147)  评论:(0)  加入收藏
1.实验说明:Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以处理浏览器等Web客户端的请求并返回相应响应,也可以放置网站文件,让全世界浏览;可以放置数据...【详细内容】
2021-07-06  Tags: web服务器  点击:(590)  评论:(0)  加入收藏
一,undertow介绍 1,undertow简介:Undertow是RedHAT红帽公司开源的产品,采用java开发,是一款灵活,高性能的web服务器,提供了NIO的阻塞/非阻塞API,也是Wildfly的默认Web容器。在javaw...【详细内容】
2021-05-07  Tags: web服务器  点击:(184)  评论:(0)  加入收藏
在这篇文章中,小编要给您推荐的是这款内置集成环境的软件,phpstudy。有些人一看到这个是国产的集成环境软件,心里就过不去,但是小编想说的是,不要因为他是国产软件就直接否定他,实...【详细内容】
2020-06-09  Tags: web服务器  点击:(152)  评论:(0)  加入收藏
苹果电脑最新的10.15.4系统,你更新了吗?如果你不幸升级,而且还是要使用SSH的用户,那么恭喜你中招了。 最近,一位名叫Taylor Hall的程序员发现,自从更新了到macOS Catalina最新版,...【详细内容】
2020-04-12  Tags: web服务器  点击:(70)  评论:(0)  加入收藏
ShareWAF做为WAF,可以不只是WAF,还可以充当负载或路由的角色。比如可以有这样一种部署架构: 在此结构中,ShareWAF部署于一台服务器,后面接多台独立的WEB服务器。 ShareWAF即做为W...【详细内容】
2020-04-09  Tags: web服务器  点击:(66)  评论:(0)  加入收藏
Web服务器安全问题仍然是IT部门最关心的问题之一,因为最近频发的网络攻击已被证明。由于存在托管敏感数据,Web服务器是一个组织中最容易被黑客针对攻击的地方。针对如何提高...【详细内容】
2020-02-16  Tags: web服务器  点击:(123)  评论:(0)  加入收藏
导语:人往高处走,水往低处流。技术发展往高层堆叠,技术学习则往底层深处探索。 参考文章:1、 百度百科:IIS:https://baike.baidu.com/item/iis/19755079Apache:https://baike.ba...【详细内容】
2020-01-02  Tags: web服务器  点击:(64)  评论:(0)  加入收藏
LinuxDeploy搭建linux服务器篇,在写到安装宝塔面板时写不下去了,虽然宝塔面板成功安装,但实际运行中一堆BUG,暂时处于卡壳状态,所以还在不断排雷中...... 所以,本来想先写内网穿透...【详细内容】
2019-12-11  Tags: web服务器  点击:(103)  评论:(0)  加入收藏
一、http_load 程序非常小,解压后也不到100Khttp_load以并行复用的方式运行,用以测试web服务器的吞吐量与负载。但是它不同于大多数压力测试工具,它可以以一个单一的进程运行,一...【详细内容】
2019-11-21  Tags: web服务器  点击:(70)  评论:(0)  加入收藏
▌简易百科推荐
本文分为三个等级自顶向下地分析了glibc中内存分配与回收的过程。本文不过度关注细节,因此只是分别从arena层次、bin层次、chunk层次进行图解,而不涉及有关指针的具体操作。前...【详细内容】
2021-12-28  linux技术栈    Tags:glibc   点击:(3)  评论:(0)  加入收藏
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(2)  评论:(0)  加入收藏
程序是如何被执行的&emsp;&emsp;程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(10)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(20)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(25)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(25)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条