• node编写服务器


    目录

    ip地址 和 域名的关系 

    传输协议

    定义:协议( Protocol)是指双方为了完成一个目标结果所必须遵守的规则和约定。 通俗的理解:双方采用约定好的格式来做某种事情,这种事先约定好的格式,就叫做协议。

    互联网中的协议

    http协议的工作原理

    交互模型

    请求和响应

    发送请求

    服务端发送响应

    node创建服务器

    http模块

    createServer方法的回调函数

    node的路由

    接收get和post请求的数据


     

     

    ip地址 和 域名的关系 

    • ip地址是用来标注设备在互联网上位置的 标识

    • 域名 是 ip地址的别名

    • ip地址可以直接访问网站 域名不行

    • 域名访问网站 要通过DNS服务器翻译为 IP地址才能访问

    传输协议

    定义:协议( Protocol)是指双方为了完成一个目标结果所必须遵守的规则和约定。 通俗的理解:双方采用约定好的格式来做某种事情,这种事先约定好的格式,就叫做协议。

    互联网中的协议

    • http:Hyper text transform protocol 超文本传输协议

      • 在这个协议的规定下 客户端和服务器之间 可以传输 超文本文件(文本、视频、音频、图片、css、js...)

    http协议的工作原理

    交互模型

    交互模型(请求与响应):HTTP 协议采用了 请求/响应 的交互模型。也就是说必须是客户端主动 发起请求,再由服务器端处理请求,同时被动的把内容响应给客户端

    • 在上述模型中 我们可以看到 在 客户端和服务端交互的过程中 存在两个 很重要的环节

      • 客户端发送 请求

      • 服务端进行 响应

    请求和响应

    • 在客户端 和 服务端交互的过程中 请求和响应 是交互的主要环节 下面我们就一起来探讨请求和响应的过程

    发送请求

    • 客户端主动发起 向服务端发送请求

    • 客户端发送的请求 实际上 发送的是一个 请求报文文件

    • 请求报文文件:本质上是一个数据包 将请求中需要携带的所有信息数据 打包为一个数据包 进行统一的发送

      • 好处:

        • 更加安全

        • 更加稳定

    • 请求报文的内容

      • 请求命令行(请求行)

        • 请求方式:get/post/put/delete

        • 发送请求的 服务端地址

        • 端口号

        • 协议版本 一般设置为 HTTP/1.1

      • 请求头部(请求头)

        • 对请求报文进行的一些配置

          • 这些配置 通过键值对来配置

      • 请求主体

        • 存放post请求提交的数据

    服务端发送响应

    • 服务端发送的响应 也是响应报文文件

    • 响应报文文件 内容如下

      • 响应命令行

        • 协议版本

        • 响应状态码

        • 响应状态码的描述

      • 响应头部

        • 响应报文的相关 配置信息

          • 通过键值对的形式进行配置

      • 响应主体

        • 服务器给客户端响应的具体数据

    • 说明:

      • 响应状态码:在响应报文中 会携带本次响应的状态码 用来标注本次响应的状态

      • 常见的响应状态码有以下五种

        • 200——OK:响应成功 响应数据 来源为 服务器

        • 304—— :响应成功 响应数据 来源为 本地缓存

        • 403——forbidden:响应失败 没有权限访问此地址

        • 404——not found:响应失败 地址找不到

        • 500及以上—— server error: 响应失败 服务器逻辑问题

    node创建服务器

    http模块

    • node想要搭建服务器 需要使用到一个内置模块——http

    • 这个内置模块 提供了一个方法——createServer 这个方法 可以创建服务器

    • 写法如下

        1. //1.引入http模块
        2. let http = require("http");
        3. //2.调用http模块的 createServer方法  
        4. //这个方法 的 返回值 就是 创建出来的服务器对象
        5. let server = http.createServer(()=>{
        6.    
        7. });
        8. //3.给服务器 设置运行的端口
        9. //服务器对象.listen(端口号,()=>{ //服务器成功运行后执行的代码 })
        10. server.listen(3000,()=>{
        11.    console.log("服务器正在运行...")
        12. })

    createServer方法的回调函数

    • createServer方法的用法

      1. http.createServer((req,res)=>{
      2. //req 全拼为 request:请求
      3. //res 全拼为 response:响应
      4. //req形参 接收请求报文相关内容 res形参 接收 响应报文相关的内容
      5. })

    res形参的应用

    • res形参 接收到的是一个对象 这个对象有一个方法——end 可以用来给客户端 响应数据

      1. http.createServer((req,res)=>{
      2. //req 全拼为 request:请求
      3. //res 全拼为 response:响应
      4. //req形参 接收请求报文相关内容 res形参 接收 响应报文相关的内容
      5. res.end(要响应的数据)
      6. })

    • 浏览器向 服务器发起请求的方式

      • 我们通过node 编写的服务器 是在本地计算机上运行的 因此被称为 本地服务器

      • 本地服务器 的ip地址——127.0.0.1:3000

      • 本地服务器的域名——localhost:3000

    • 当我们打开服务器地址的时候 就可以看到 服务器响应的数据 但是 服务器如果响应的是中文字符串 会导致乱码,这就需要我们手动设置编码格式

    • 我们可以通过设置响应头 来实现 编码格式的设置

      • res形参中 给我们提供了一个方法setHeader 可以帮助我们设置 响应头

      • 用法:res.setHeader("键名","键值")

      • 设置编码格式的写法

          1. http.createServer((req,res)=>{
          2. //req 全拼为 request:请求
          3. //res 全拼为 response:响应
          4. //req形参 接收请求报文相关内容 res形参 接收 响应报文相关的内容
          5. //设置编码格式
          6. res.setHeader("content-type","text/plain;charset=utf8")
          7. res.end(要响应的数据)
          8. })

        • 在上述代码中 content-type的键值由两部分构成

          • text/plain:MIME类型

          • charset=utf8:编码格式

      • 注意:设置响应头的代码 一定要写在 响应数据之前(也就是end方法调用之前)

    MIME类型

    • http是一种超文本传输协议,因此 我们的响应数据 可以是任意类型的数据

    • 但是 在响应不同类型数据的时候 需要将响应头中数据类型进行对应的设置

    • MIME类型对照表 参见 MIME 类型 | 菜鸟教程

    设置响应头的方法

    • setHeader

        1. http.createServer((req,res)=>{
        2. res.setHeader("键名","键值")
        3. })

    • writeHead

        1. http.createServer((req,res)=>{
        2. res.writeHead(响应状态码,{键名:"键值"})
        3. })

    res形参总结

    • 设置响应头:

      • res.setHeader

      • res.writeHead

    • 响应数据

      • res.end

    • MIME类型:响应不同类型的文件 需要 设置对应的MIME类型(设置在响应头中)

    req形参的应用

    req形参的属性

    • url

        1. http.createServer((req,res)=>{
        2. console.log(req.url)
        3. })

      • 含义:req.url 表示获取请求报文中 url地址中的 资源在服务器中的具体路径部分

      • 应用场景:我们通常使用这个属性 来实现 node的路由

      • 使用url实现路由切换页面

    • method

        1. http.createServer((req,res)=>{
        2. console.log(req.method)
        3. })

      • 含义:req.method 表示获取请求报文中 请求方式

      • 我们可以使用不同的请求 来测试该属性的效果

        • 在地址栏中输入服务器地址 访问服务器默认是get请求

        • 如果想使用post请求 我们可以使用vscode提供的一个插件 来测试——rest client

      • rest client的用法

        • 安装了这个插件之后 我们就可以编写一种文件——.http文件

        • .http文件 就是 请求报文

        • .http文件的内容 必须要严格遵循 请求报文的格式

    node的路由

    • node路由中的资源静态化问题

      • 在node路由页面 html文件中 往往会使用到 一些资源文件(图片、视频、音频等)

      • 如果我们直接做路由 这些资源文件 将无法正常加载

      • 这时我们就需要通过资源静态化的方式 让这些页面中的资源文件 能正常加载

    • 资源静态化的规则

      • 1.将所有资源文件 统一存放在一个文件夹中

      • 2.在这个文件夹中 对资源文件 进行分类存储

      • 3.在node服务器代码中 进行资源静态化 

    接收get和post请求的数据

    • 接收get请求提交的数据

      • 在node中 我们是通过 req形参来接收的

      • req形参有一个属性 url 可以接收到get请求提交的查询字符串

        1. http.createServer((req,res)=>{
        2. console.log(req.url);
        3. })

    • 接收post请求提交的数据

      • 在node中 我们是通过req形参的两个事件 来协同工作 接收 post请求提交的数据

      • 分别是 data事件 和 end事件

      • node中绑定事件的写法

        • 对象.on("事件名",处理函数)
      • 接收post请求提交数据 写法如下

          1. http.createServer((req,res)=>{
          2.    let d;
          3.    req.on("data",(data)=>{
          4.        //在node开始接收post请求提交的数据的时候 就会触发 data事件
          5.        //形参data 就是用来接收 post请求提交的数据
          6.        d = data;
          7.   });
          8.    req.on("end",()=>{
          9.        //当post请求提交的数据 接收完之后 就会触发end事件
          10.        console.log(d.toString());
          11.   })
          12. })

        • 注意:接收post提交的数据 接收到的结果 是一个二进制数据 因此 在具体使用的时候 应该先对其进行转换

     

     

  • 相关阅读:
    2022-10-20 C++并发编程( 三十五 )
    PCB铺铜连接方式
    Java FreeMarker模板引擎注入深入分析
    Python常见面试题
    【Linux】linux中你不得不爱的命令集(上)
    【IoT】产品认证:国密认证中的委托人、生产者、生产企业是什么意思?
    毅速课堂:3D打印随形水路在小零件注塑中优势明显
    08_Linux基础-vim-tmux-字符编码
    Docker轻量级可视化工具Portainer
    液压系统中比较常用的密封件是什么?
  • 原文地址:https://blog.csdn.net/weixin_64037609/article/details/127419421