node原生server

本文深入剖析了服务器与客户端之间的服务交互过程,包括现实生活中与互联网上的服务模式,详述了URL、HTTP/HTTPS、协议、服务器、客户端、域名与IP、端口号等关键概念,并展示了Node.js创建服务器的实例。
摘要由CSDN通过智能技术生成

服务端与客户端

什么是上网

通过因特网(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: 更加安全。

服务器名称

域名。可以理解为你的服务器在哪里。

端口号

​ 本身服务器是一个封闭的状态 。客户虽然能访问服务器,是因为服务器自身开启了一个端口(指向某一个根文件夹)。

  1. 电脑上都有qq、微信(为什么能准确的收到消息,就是因为软件都有唯一的端口号)

  2. 学校食堂。食堂的大门相当于我们网线的口(是不是有各种各样的窗口:这个窗口就是端口)。

    在一台电脑上不可能出现同一个端口。

    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)
}

})


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值