webserver烂大街?还有必要做么?

简介: webserver烂大街?还有必要做么?

       都说webserver是C++选手人手必备的烂大街项目,那么webserver 还有必要做么?答案是要做,而且必须做,大家有的,我们也要有,而且webserver其实涉及到的技术和知识点是很多的,如果能一步一步把所有知识点掌握,其实在技术上是有很大的提升的,尤其是在对网络编程http这块,面试也有了和面试官聊天的底气。        

什么是 Web Server?

顾名思义,Web Server 就是提供 Web 服务的 Server。比如我们访问 http:// http://baidu.com,其实就是在使用百度的 Server 提供的服务。一般来说, Web Server 对外提供的是 HTTP 服务(也可以是其他服务),这就是为什么我们的网址都以「http://」开头。


如何提供 HTTP 服务?

下面是有 Node.js 写的一个最简单的 HTTP server

var http = require('http')
 
var server = http.createServer( function (request, response){
    response.end('访问成功,你请求的路径是:' + request.url)
})
 
server.listen(8080, function(){
    console.log("正在监听 %s 端口", 8080);
});
 

这里你不用看懂这段程序,你只需要知道两件事情:

  1. 这段程序监听了当前机器的 8080 端口。
  2. 一旦外部访问当前机器的 8080 端口,这段程序就会返回一段文字。

那么这就是一个最简单的 HTTP server。

       看到这里,我们大概对webserver这个项目有一定的认识了,我们需要做的就是实现一个程序,其主要功能是通过 HTTP协议与客户端(通常是浏览器(Browser))进行通信,来接收,存储,处理来自 客户端的 HTTP 请求,并对其请求做出 HTTP响应,返回给客户端其请求的内容(文件、网页等)或返回一个 Error 信息。

HTTP协议

简介

       超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使开发和部署非常地直截了当。

工作原理

       HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。 WWW是以Internet作为传输媒介的一个应用系统,WWW网上最基本的传输单位是Web网页。WWW的工作基于客户机/服务器计算模型,由Web 浏览器(客户机)和Web服务器(服务器)构成,两者之间采用超文本传送协议(HTTP)进行通信。HTTP协议是基于TCP/IP协议之上的协议,是Web浏览器和Web服务器之间的应用层协议,是通用的、无状态的、面向对象的协议。


HTTP是基于客户/服务器模式,且面向连接的。典型的HTTP事务处理有如下的过程:

(1)客户与服务器建立连接;

(2)客户向服务器提出请求;

(3)服务器接受请求,并根据请求返回相应的文件作为应答;

(4)客户与服务器关闭连接。

工作步骤

HTTP协议的作用原理包括四个步骤(具体):  

1. 连接:Web浏览器与Web服务器建立连接,打开一个称为socket(套接字)的虚拟文件,此文件的建立标志着连接建立成功。


2. 请求:Web浏览器通过socket向Web服务器提交请求。HTTP的请求一般是GET或POST命令(POST用于FORM参数的传递)。GET命令的格式为:GET 路径/文件名 HTTP/1.0 文件名指出所访问的文件,HTTP/1.0指出Web浏览器使用的HTTP版本。


3. 应答:Web浏览器提交请求后,通过HTTP协议传送给Web服务器。Web服务器接到后,进行事务处理,处理结果又通过HTTP传回给Web浏览器,从而在Web浏览器上显示出所请求的页面。


4. 关闭连接:客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接

HTTP请求报文格式

然后合理运用GPT^-^ 嘿嘿 学习最快的方式之一是GPT 之二是关注我

HTTP响应报文格式

然后再次合理运用GPT^-^ 嘿嘿 学习最快的方式之一是GPT 之二是关注我

HTTP请求方法

  • GET:向指定的资源发出“显示”请求。使用 GET 方法应该只用在读取数据,而不应当被用于产生“副 作用”的操作中,例如在 Web Application 中。其中一个原因是 GET 可能会被网络蜘蛛等随意访 问。
  • HEAD:与 GET 方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文 部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该 资源的信息”(元信息或称元数据)。
  • POST:向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含 在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。
  • PUT:向指定资源位置上传其最新内容。
  • DELETE:请求服务器删除 Request-URI 所标识的资源。
  • TRACE:回显服务器收到的请求,主要用于测试或诊断。
  • OPTIONS:这个方法可使服务器传回该资源所支持的所有 HTTP 请求方法。用’*'来代替资源名称, 向 Web 服务器发送 OPTIONS 请求,可以测试服务器功能是否正常运作。
  • CONNECT:HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服 务器的链接(经由非加密的 HTTP 代理服务器)。

HTTP状态码

状态代码的第一个数字是代表当前响应的类型(具体也可以GPT了解):

1xx消息——请求已被服务器接收,继续处理

2xx成功——请求已成功被服务器接收、理解、并接受

3xx重定向——需要后续操作才能完成这一请求

4xx请求错误——请求含有词法错误或者无法被执行

5xx服务器错误——服务器在处理某个正确请求时发生错误

总结

       总之,webserver还是很值得做的,而且webserver包含的知识点很多,能够不查询资料手写webserver的都是狠人。一步一个脚印,相信一份耕耘一份收获,后续会更新手把手分享webserver项目的细节~

相关文章
星际争霸之小霸王之小蜜蜂(十一)--杀杀杀
星际争霸之小霸王之小蜜蜂(十一)--杀杀杀
|
5月前
|
JavaScript 数据挖掘 程序员
老程序员分享:Piwik学习
老程序员分享:Piwik学习
|
11月前
|
监控 应用服务中间件 调度
Nginx为什么快到根本停不下来?
Nginx为什么快到根本停不下来?
228 0
|
缓存 前端开发 JavaScript
Nginx - 学相伴 (做项目连夜学)
过两天要去XX公司外包做项目了,需求里有个没学过的,NGINX,淦 连夜看一看,顺口提一下,某音跟监听我说话似的,刚跟小姐姐聊了一下nginx,回家刷视频就给我推荐了nginx的视频,你说它牛逼吧,确实牛逼,但我这心里有点忐忐忑忑…
207 0
Nginx - 学相伴 (做项目连夜学)
|
前端开发 JavaScript IDE
YourBatman用趣味代码雨祝你:端午安康
使用Java的AWT给你写了个祝福
235 0
YourBatman用趣味代码雨祝你:端午安康
|
存储 NoSQL 关系型数据库
六脉连环大总结,教你干趴Docker
六脉连环大总结,教你干趴Docker
150 0
六脉连环大总结,教你干趴Docker
|
Java Go Spring
Springboot 居然可以设置动态的Banner!!(悄悄滴~)|牛气冲天新年征文
正题开始啦~ 牛年啦~ 咋们也研究下怎么给我们滴 IDEA 添加点 过年滴气氛,像这样 Spring boot 源码 之 Banner 源码看起来 <( ̄︶ ̄)↗[GO!] Springboot 启动时,会先去创建SpringApplication 对象 。 SpringApplication 构造器 指定banner的模式 Banner 函数式接口 这里有三种模式 run 方法 创建banner对象 进入上图红框中,可以看到这里如果不是 OFF 模式的话会去创建 SpringApplicationBannerPrinter 对象 可以看到该类中还定义了 图片的类型(居然还支持 gif
280 0
|
资源调度 Kubernetes JavaScript
在IIS中部署SPA应用,多么痛的领悟!
前后端应用最终以容器形态、在k8s中部署, 为此我搭建了基于Gitlab flow的Devops流程。
在IIS中部署SPA应用,多么痛的领悟!
|
缓存 负载均衡 Kubernetes
鹅厂二面,Nginx回忆录
上周二面鹅厂,面试官问出了“nginx你了解吗?”这样宽泛直白的句式,我一时抓不到重点,一时语噻。 下班想了一下,平时潜移默化用到不少nginx的能力,但在面试的时候没有吹成对应的概念。
鹅厂二面,Nginx回忆录
|
SQL 缓存 Java
在项目中随手把haseMap改成了currenHaseMap差点被公司给开除了。
在项目中随手把haseMap改成了currenHaseMap差点被公司给开除了。
141 0