服务器的类型及作用是什么,服务器的功能有哪些,简述服务器的种类及作用

本文详细介绍了构建一个简单Web服务器的过程,包括初始化ServerSocket、使用线程池处理客户端连接、解析HTTP请求、根据请求路径执行相应操作(如文件查找或Servlet调用)以及如何通过反射机制加载和实例化Servlet。此外,还提到了SpringBoot应用如何自动启动内嵌的Tomcat服务器,简化了传统Web服务器的搭建步骤。
摘要由CSDN通过智能技术生成

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

f0a8fc09eb01d4561babd6ba1989e9bc.png

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

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

实现大致步骤:

初始化服务端ServerSocket

初始化TreadPool

while(true)等待客户端连接

<>

客户端请求

clientHandler处理客户端的请求

线程池的线程处理handler

根据输入流解析请求(解析请求行,解析消息头,解析消息正文)

根据输出流创建响应对象(发送状态行信息,发送响应头信息,发送响应正文信息)

<>

寻找servlet 根据请求路径找到需要哪个servlet处理(选择handler)

通过反射机制加载这个类

实例化servlet

servlet处理请求(执行handler结束)

<>

一个应用程序是不是先要启动起来?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服务器实例,至于怎么做到自动的,你问过自己为什么吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值