服务端与客户端
什么是上网
通过因特网(internet)进行获取各种各样的资源(文字、图片、音频、视频,…css/js)
获取资源的过程就也就是享受服务的过程 。
享受服务的流程
1、现实生活中的服务
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cCZte5uK-1635505442136)(img\2-11用户与海底捞.png)]
请求:用户主动发起请求
处理:服务员(是属于后端的范畴:服务软件),它要进行各种各样的调度(处理:用户的/后厨的),餐馆(理解为计算机电脑)
响应:服务员要把后厨处理好的各种食材给用户端上去。
2、互联网上的服务(客户端与服务器端的一次请求流程)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lCkVfP8Y-1635505442139)(img\2-12客户端与服务器.png)]
请求:用户通过浏览器地址栏主动访问某个网址
处理:服务器上要寻找有无此页面
响应:服务器把页面返回给用户的浏览器
对于浏览器是把页面渲染在浏览器中。
服务器
就是一台安装了能提供服务软件的一台电脑。但实际投入使用的服务器它的配置很高。
服务器种类有很多种:学习、上网页、游戏、聊天、视频的、直播…
举例:CTS服务器、优就业官网、中公教育服务器、淘宝www.taobao.com、百度www.baidu.com、腾讯www.qq.com
- 本地服务器:
/*
http://localhost:3000
http://127.0.0.1:3000 代表访问的是本地的电脑这个服务器。
http://自己的IP地址:3000
*/
客户端
客户是访问服务器的。电脑、手机、智能手表…
A终端访问B终端:A(客户) B(服务)
url地址
基本概念
简单来说就是网址。URL(全称是Uniform Resource Locator)中文叫统一资源定位符,用于标识互联网上每个资源的唯一存放位置。浏览器只有通过URL地址,才能正确定位资源的存放位置,从而成功访问到对应的资源。
URL
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mhco6BhG-1635505442141)(img\2-13url组成.png)]
通信协议
规定。如何访问一个url,访问的url中的资源如何再返回给用户的。
http/https
https: 更加安全。
服务器名称
域名。可以理解为你的服务器在哪里。
端口号
本身服务器是一个封闭的状态 。客户虽然能访问服务器,是因为服务器自身开启了一个端口(指向某一个根文件夹)。
-
电脑上都有qq、微信(为什么能准确的收到消息,就是因为软件都有唯一的端口号)
-
学校食堂。食堂的大门相当于我们网线的口(是不是有各种各样的窗口:这个窗口就是端口)。
在一台电脑上不可能出现同一个端口。
http:默认端口为80
https:默认端口为443
默认端口是可以在url中省略的。
路径
是相对于的 服务器根地址 来寻找的。
参数
通过参数告诉服务器你想要什么 。
/login?username=zs&password=1234
域名与ip的关系
IP
标识计算机就是用的 IP。
IPv4:x.x.x.x , 0-255(包含0和255)
IPv6:x,x,x,x,x,x
IP理解为详情地址:北京市西城区西单北大街109号西单婚庆大楼F7
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3x8Nq46y-1635505442144)(assets/1634193606617.png)]
域名
域名:地址的简称【海底捞(西单店)】
.com com.cn .cn .org .net
DNS服务器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KnKFGeNA-1635505442146)(img\2-14DNS-域名与ip的关系.png)]
DNS服务器的作用就是 某个域名指向某个电脑的IP。当你访问某个域名,其实就是访问的域名所指向的IP的这台电脑 。
whois查询可以看域名的信息: https://whois.chinaz.com/
cmd快速查看域名和ip的指向: ping 域名 (查看此域名通不通)
互联网传输协议
什么是协议:协议( Protocol)是指双方为了完成一个目标结果所必须遵守的规则和约定。
通俗的理解:双方采用约定好的格式来做某种事情,这种事先约定好的格式,就叫做协议。
协议分类
现实中的协议
邮寄规则:寄件人信息、收件人信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W4XV5MzG-1635505442147)(img\2-15现实中的协议.png)]
互联网中的传输协议
Http(HyperText Transfer Protocol):超文本传输协议 (文本、图片、视频、音频、css、js…)。
如何请求(把用户的数据传递给服务器)以及如何响应(服务器的数据如何给用户)
https:它是基于http的,只不过更安全了而已。secret
工作原理
交互模型(请求与响应)
交互模型(请求与响应):HTTP 协议采用了 请求/响应 的交互模型。也就是说必须是客户端主动发起请求,再由服务器端处理请求,同时被动的把内容响应给客户端
**而且有请求必须有响应。**而且是一一对就应。
http协议的组成
请求消息、响应消息、请求方法、状态码
请求方法
用来表明要对服务器上的资源执行的某操作,以何种方式进行请求。
常见请求方法比如:get获取/post提交数据/delete删除/put更新的
状态码
用来标识响应的状态。服务器的结果要用状态码来进行描述。比如:404页面不存在 NOT FOUND。200成功OK
状态码能够告诉后端或前端,这次请求是否成功了。
请求报文
用户发请求的时候,用户的内容是通过什么格式发送给服务器的。格式(请求消息格式)
描述:客户端发起的请求叫做 HTTP 请求,客户端发送到服务器的消息,叫做 HTTP 请求报文。简单来说就是客户端告知服务器我要干什么。
组成:请求行、请求头部( 字段参数 )、空行、请求体
请求头部( 字段参数 ):当在发送请求时,浏览器会额外自动的携带一些参数过去(给服务器)。
我们以一个网址为例:http://www.ujiuye.com/zt/webqzgcs/index.html
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ppv8PPZr-1635505442149)(img\2-16请求消息.png)]
请求体:只有post方式才有请求体。get没有请求体
响应报文
描述:响应报文就是服务器响应给客户端的消息内容。比如:海底捞服务员把后厨准备好的食材交付给用户
组成:状态行、响应头部、空行、响应体
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qhiNocDn-1635505442151)(img\2-18响应消息.png)]
304是因为缓存造成的,强制刷新就好了。
Node原生创建服务器
创建服务器步骤
- 原生node提供了一个http模块(内置)
//1. 引入http模块
const http = require('http') //暴露的是一个对象
const server = http.createServer() //创建服务器对象
//2. 服务器是封闭的,必须开启一个端口( 0-65535 ) ,不包含0和65535 我们尽量使用3000及以上
//因为有一些内置软件(小的基本已经被占用了)
server.listen( 3000 ) //兼听、开启端口
//3. 服务器要写个事件:兼听用户发起请求的事件
server.on( 'request',function( request,response ){
//request 请求对象
//response 响应对象
res.end('hello nodejs')//发送响应内容给用户,必须是字符串
})
//注意:修改了http服务相关的代码,必须重新node一下。
代码演示1:
设置响应头信息。
//我们得告诉浏览器,用utf8去解析字符
res.writeHead(200,{'Content-Type':"text/html;charset=utf8"})
// text/plain: 以纯文本形式展示
const http = require('http')
const server = http.createServer()
server.listen(3000)
server.on('request',(req,res)=>{
res.writeHead( 200,{ "Content-Type":'text/html;charset=utf8' } )
//res.end('我是中文 hello')
res.end('<h1>hello</h1>')
})
代码演示2:
打印请求消息。method和url
req.method
req.url
代码演示3:
根据不同路径地址返回不同消息。/login和/register
server.on('request', (req, res) => {
//req: 请求消息对象,用户传递的消息都在此对象
//请求地址也在req中。req.url
res.writeHead(200, { "Content-Type": 'text/html;charset=utf8' })
//res.end('请求的地址为:' + req.url)
let canshu = req.url.split('?')
console.log( canshu ) // username=zs&pasword=123
if( req.url.startsWith( '/login' ) ){ //判断以xxx开头的方法
res.end('登录') //end只能一次
}else if( req.url.startsWith('/register') ){
res.end('注册')
}else{
res.end('你到火星了')
}
})
代码演示4:
根据不同路径地址返回对应html页面内容/login和/register
server.listen(3000,()=>{
console.log('3000端口已开启,可以访问:http://localhost:3000')
})
const fs = require('fs')
const path = require('path')
server.on('request', (req, res) => {
res.writeHead( 200,{ "Content-Type":"text/html;charset=utf8" } )
if( req.url.startsWith( '/login' ) ){
let filepath = path.join( __dirname,'views/login.html' )
let result = fs.readFileSync( filepath ) //读取到的是buffer二进制
res.end(result) //end只能一次
}else if( req.url.startsWith('/register') ){
let filepath = path.join( __dirname,'views/register.html' )
let result = fs.readFileSync( filepath )
res.end(result)
}else{
let filepath = path.join( __dirname,'views/404.html' )
let result = fs.readFileSync( filepath )
res.end(result)
}
})
) //end只能一次
}else if( req.url.startsWith(’/register’) ){
let filepath = path.join( __dirname,‘views/register.html’ )
let result = fs.readFileSync( filepath )
res.end(result)
}else{
let filepath = path.join( __dirname,‘views/404.html’ )
let result = fs.readFileSync( filepath )
res.end(result)
}
})