1.服务器:
- 服务器可以是专业服务器也可以是个人电脑;
- 能在特定IP(服务器)的特定端口上监听客户端的请求,并根据请求的路径返回相应结果,这都叫服务器。
2.客户端:
- 只要能向特定IP(服务器)的特定端口发起请求并接受响应的,这都叫客户端;
- 例如:mac、iphone、ipad、apple等等
3. 什么是http事务呢?
- 一个http事务由一条(从客户端发往服务器的)请求命令和一个(从服务器发回客户端的)响应结果组成。
4. http
- 人与人之间通信,需要一种传输手段 (声波)和一种彼此都懂的语言(比如普通话)
- 要让这些形形色色的机器能够通过网络进行交互,我们就需要指明一种协议 (比如 HTTP/HTTPS)和一种数据封装格式 (比如 HTML/JSON)
- http指的就是指的就是这种协议+数据格式的交流体系
5.https
- 是确保安全的HTTPS
- HTTPS=HTTP+加密+认证+完整性保护
6.网站访问的流程:
- ①发送请求
- 浏览器(或其它客户端如微信)向服务器发出一个HTTP请求;
- 先把域名解析为IP地址 (chrome缓存1分钟(chrome://net-internals/#dns)>搜索
操作系统缓存>读取本地host文件>发起DNS系统调用>运营商DNS缓存); - 客户端通过随机端口向服务器发起TCP三次握手,建立了 TCP连接 ;
- 连接建立后浏览器就可以发送HTTP请求了;
- 服务器接收到HTTP请求,解析请求的路径和参数,经过后台的一些处理之后生成完整响应页面;
- 服务器将生成的页面作为HTTP响应体,根据不同的处理结果生成响应头,发回给客户端。
- ②得到相应
- 客户端(浏览器)接收到 HTTP 响应,从请求中得到的 HTTP 响应体里是HTML代码,于是对HTML代码开始解析 ;
- 解析过程中遇到引用的服务器上的资源(额外的 CSS、JS代码,图片、音视频,附件等),再向服务器发送请求;
- 浏览器解析HTML包含的内容,用得到的 CSS 代码进行外观上的进一步渲染,JS 代码也可能会对外观进行一定的处理 ;
- 当用户与页面交互(点击,悬停等等)时,JS 代码对此作出一定的反应,添加特效与动画;
- 交互的过程中可能需要向服务器索取或提交额外的数据(局部的刷新),一般不是跳转就是通过 JS 代码(响应某个动作或者定时)向服务器发送 AJAX 请求;
- 服务器再把客户端需要的资源返回,客户端用得到的资源来实现动态效果或 修改DOM结构 。
- ③创建服务
var http = require('http');
http.createServer(function (req,res) {
res.end('你好');
}).listen(8080);
响应中文出现乱码问题
- 设置响应头
res.setHeader('Content‐type','text/plain;charset=utf8');
res.statusCode = 200;
res.writeHead(200,{'Content‐type':'text/plain;charset=utf8'});
可以返回html文件
var fs = require('fs');
fs.createReadStream('./index.html').pipe(response);
页面中的js,css返回的均为html;需要根据路径返回不同的内容
请求信息
- 请求路径
console.log(req.url);
- 请求方法
console.log(req.method);
- 请求头信息
console.log(req.headers);
- http服务
var http = require('http');
var fs = require('fs');
http.createServer(function (request,response) {
if(request.url=='/hello.html'){
response.setHeader('Content‐type','text/html;charset=utf8');
fs.createReadStream('./hello.html').pipe(response);
}else if(request.url=='/favicon.ico'){
response.statusCode = '404';
response.end('');
}else if(request.url=='/style.css'){
response.setHeader('Content‐type','text/css;charset=utf8');
fs.createReadStream('./style.css').pipe(response);
}else if(request.url=='/index.js'){
response.setHeader('Content‐type','application/x‐javascript;charset=utf8'
fs.createReadStream('./index.js').pipe(response);
}).listen(8080)
路径参数
当访问路径时带有查询参数,无法访问到正确路径- url模块
url.parse第二个参数将query变为对象格式
- url模块
var url = require('url');
console.log(url.parse(path,true));
Url {
protocol: 'http:', 协议
slashes: true, 是否有 //
auth: null, 用户名密码
host: 'zhidao.baidu.com', 主机
port: null, 80 端口
hostname: 'zhidao.baidu.com', 主机名
hash: null, hash值
search: '?lm=0&rn=10&pn=0&fr=search&ie=gbk&word=asdasd', 路径和和hash值之间的
query: 'lm=0&rn=10&pn=0&fr=search&ie=gbk&word=asdasd', 同过true转换成对象
pathname: '/search', 路径
path: '/search?lm=0&rn=10&pn=0&fr=search&ie=gbk&word=asdasd', 路径+查询字符串
href: 'http://zhidao.baidu.com/search?lm=0&rn=10&pn=0&fr=search&ie=gbk&word=asdasd'
根据pathname来进行路径的判断
- 改造服务
var urlObj = url.parse(request.url,true);
var pathname = urlObj.pathname;
if(pathname=='/'){
response.setHeader('Content‐type','text/html;charset=utf8');
fs.createReadStream('./index.html').pipe(response);
}else if(pathname=='/style.css'){
response.setHeader('Content‐type','text/css;charset=utf8');
fs.createReadStream('./style.css').pipe(response);
}
- 合并冗余代码
var http = require('http');
var fs = require('fs');
var url = require('url');
var path = require('path');
var mime = {
'.html':'text/html',
'.js':'application/x‐javascript',
'.css':'text/css',
}
http.createServer(function (request,response) {
var urlObj = url.parse(request.url,true);
var pathname = urlObj.pathname;
if(pathname=='/'){
response.setHeader('Content‐type','text/html;charset=utf8');
fs.createReadStream('./index.html').pipe(response);
}else if(pathname=='/favicon.ico'){
response.statusCode = 404;
response.end('');
}else{
response.setHeader('Content‐type',mime[path.extname(pathname)]+';charset=utf8'
fs.createReadStream('.'+pathname).pipe(response);
}
}).listen(8080);
- 使用mime模块
var http = require('http');
var fs = require('fs');
var url = require('url');
var path = require('path');
var mime = require('mime');
http.createServer(function (request,response) {
var urlObj = url.parse(request.url,true);
var pathname = urlObj.pathname;
if(pathname=='/'){
response.setHeader('Content‐type','text/html;charset=utf8');
fs.createReadStream('./index.html').pipe(response);
}else {
var flag = fs.existsSync('./' + pathname);
if (flag) {
response.setHeader('Content‐type', mime.lookup(pathname) +
fs.createReadStream('.' + pathname).pipe(response);
} else {
response.statusCode = 404;
response.end();
}
}
}).listen(8080);