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项目的细节~

目录
打赏
0
0
0
0
25
分享
相关文章
惊呆了!这些前端技巧竟然能让你的网站秒变高大上,赶快学起来!
前端技术是网页设计的核心,能够显著提升用户体验和网站竞争力。本文介绍了三种实用的前端技巧:动态背景效果、微交互设计和响应式设计。通过CSS动画和JavaScript,可以实现视觉吸引的动态背景;微交互设计如按钮点击效果能增强用户参与感;响应式设计则确保网站在不同设备上呈现良好效果。这些技巧简单易学,效果显著,值得尝试。
43 3
JavaWeb编年史(黄金时代)2
很多人都有一个误区,觉得上面那种模块化项目就是分布式系统了。其实不然,模块化本质上还是一个单体项目,只是把原来的一个个package转换成一个个module来开发而已。这个最多叫做分模块,而不是分布式。而且,模块之间往往有强依赖性,比如web-dao就必须依赖于web-model,否则连编译都通不过。
112 0
JavaWeb编年史(黄金时代)1
从JavaWeb编年史的远古时代,一直到白银时代,我们见证了JavaWeb开发模式的大致变迁。说白了,就是不断解耦合的过程。接下来我们来聊聊项目架构的演变,之所以我把它划到了JavaWeb编年史(黄金时代),是因为在早期的JavaWeb项目中,很少有架构的概念,基本就是一个单体项目,然后不断在已有项目上堆砌新的功能。所以,当我们开始有了架构的概念,其实也是一种非常大的进步,我个人称之为黄金时代,哈哈。
165 0
Springboot 居然可以设置动态的Banner!!(悄悄滴~)|牛气冲天新年征文
正题开始啦~ 牛年啦~ 咋们也研究下怎么给我们滴 IDEA 添加点 过年滴气氛,像这样 Spring boot 源码 之 Banner 源码看起来 <( ̄︶ ̄)↗[GO!] Springboot 启动时,会先去创建SpringApplication 对象 。 SpringApplication 构造器 指定banner的模式 Banner 函数式接口 这里有三种模式 run 方法 创建banner对象 进入上图红框中,可以看到这里如果不是 OFF 模式的话会去创建 SpringApplicationBannerPrinter 对象 可以看到该类中还定义了 图片的类型(居然还支持 gif
298 0
鹅厂二面,Nginx回忆录
上周二面鹅厂,面试官问出了“nginx你了解吗?”这样宽泛直白的句式,我一时抓不到重点,一时语噻。 下班想了一下,平时潜移默化用到不少nginx的能力,但在面试的时候没有吹成对应的概念。
鹅厂二面,Nginx回忆录
端午还在“修锁”?你是真的卷王!(一)
哈喽,大家好,我是指北君。 今天为你带来的是 ReentrantLock 公平锁与非公平锁的源码分析,它是 Java 并发包下的一个 java.util.concurrent.locks 实现类,实现了 Lock 接口和 Serializable 接口。
端午还在“修锁”?你是真的卷王!(一)
端午还在“修锁”?你是真的卷王!(二)
今天为你带来的是 ReentrantLock 公平锁与非公平锁的源码分析,它是 Java 并发包下的一个 java.util.concurrent.locks 实现类,实现了 Lock 接口和 Serializable 接口。
端午还在“修锁”?你是真的卷王!(二)