不然我们来做一个——服务器?
服务器和电脑有什么区别呢?其实基本没什么区别。无非是稳定性高,有网,CPU好(有的服务器可能有128核),然后内存高,基本没有显示器包括显卡,因为不需要。你完全可以把你的电脑配置成一个小型服务器。
为了更深入的了解服务器的原理,让我们来做一个很简单很简单的服务器吧!
有了电脑,我们就有了服务器。但是我们还缺了提供HTTP服务的程序。所以我们用脚本来提供HTTP服务。Bash和Node.js都可以,这里我用Node.js。
Node.js服务器
接收请求
1. 进入一个安全的目录,新建文件touch server.js
2. 编辑server.js,直接拷贝这段代码就好了
3. 运行node server或者node server.js。
4. 成功之后,这个server会保持运行状态,如果你要退出的话可以按Ctrl+c(cancel)。但是测试完成之前我不建议你退出。你可以新开一个窗口访问这个服务器。
5. 在新的Bash窗口运行curl http://localhost:你指定的端口/xxx
或者 curl http://127.0.0.1:你指定的端口/xxx
。
你可以发现server会打印出你请求的路径。这说明我们新建的server收到了我们用curl发出的请求。但由于server并没有发出响应,所以curl一直在等待,用Ctrl+c中断它。
发出响应
1. 编辑server.js,在中间标注的区域添加两行代码
response.write('Hello')
response.end()
- 中断之前的server,运行
node server.js 8888
- 再次使用curl发起请求。你现在可以得到浏览器的响应了。
- 我知道你肯定会觉得自己访问自己很奇怪,事实上你可以用手机输入
http://你电脑的IP:你指定的端口/xxx
来进行测试。
一点点的课外延展
这里是在上边的基础之上做的一些完善。
在上边的步骤中,无论我们输入什么路径,最后得到的结果都是Hello。如果说我只提供根路径的访问,对于其他的访问都拒绝呢?试着加一个判断。
if(path == '/'){
response.write('Hello');
response.end();
}else{
response.statusCode = 404; //设置状态码为404,表示你所请求的页面不存在
response.end();
}
如果我想,得到一个网页呢?把response.write('Hello');
里边的字符串Hello改成一个标准的html文档吧!不过如果只是这样的话,当然并没有什么用。你对她进行访问得到的会是源码,因为浏览器并不知道要如何解析它。我们说过,文件后缀并没有什么用。
所以我们需要一点别的东西。比如————response.setHeader('Content-Type','text/html')
,这一段的信息你可以通过运行curl -s -v -- "http://localhost:8888"
命令在响应的第二部分看见。作用我们说过了,确定响应的第四部分该如何解析。
事实上,即使这样,你依旧可能会遇到意想不到的问题,比如乱码。我们都知道乱码是由于两个运行环境编码不一致导致的,要解决也简单。依旧是在Header里边进行设置,只不过这一次设置的是charset。response.setHeader('Content-Type','text/html; charset=utf-8')
至此,服务器给我们的响应四个部分已经全部可以由我们自行设置。如果你忘了http协议的请求与响应部分的话的话请看这里。
- 第一部分:response.statusCode = 404
- 第二部分:response.setHeader()
- 第三部分:回车。。
- 第四部分:response.write()
从URL输入到看见网页发生了什么…
虽然我写过这样一篇博客,但还是忍不住再来一遍。。
1. 输入网址的时候浏览器会先看你的输入缺了些什么,然后再给你补全。比如你输入www.baidu.com,它会给你加上https协议开头,加上默认端口号80,加上默认的根路径/。所以最终的结果其实是https://www.baidu.com/:80
.
2. 补全URL之后呢,会查询DNS,向DNS发起询问查IP。
3. 拿到ip之后向服务器的IP地址发起http请求。
4. 然后服务器接收到了请求之后,看你的路径是什么,根据路径给你设置header然后返回html然后结束。
5. 我们将服务器返回的数据下载下来,然后浏览器根据规则将其解析然后我们可以看见。一边解析的时候浏览器会根据link的资源继续发起资源请求。
6. over