Web前端105天-day64-HTML5_CORE

news2024/11/25 7:00:43

HTML5CORE04

目录

前言

一、复习

二、WebSocket

三、服务器搭建

四、聊天室

五、defineProperty

5.1.初识defineProperty

5.2.配置多个属性

5.3.可配置

5.4.赋值监听

5.5.练习

5.6.计算属性

总结


前言

HTML5CORE04学习开始


一、复习

SVG:

  • 利用HTML的 DOM 来绘制图形
  • 特色
    • 放大缩小都不会失真
    • 图片的内容可以通过DOM方式进行操作

Echarts:

  • 第三方的 图表库
  • 非常适合时下流行的 数据大屏
  • 使用方式: 复制 -> 粘贴 -> 改一改

回调地狱:

  • 当多个 回调函数 层层嵌套时, 会导致 代码的阅读和维护复杂

Promise:

  • 来自ES6提供的构造函数, 其构造出来的对象可以利用链式语法 来解决 回调地狱 的格式问题
  • new Promise().then().then().then()...
  • 语法糖: asyncawait 用于代替链式写法
  • async function xxx(){
        var res = await new Promise();
    }

二、WebSocket

  • 不同于之前学习的 Http 协议
    • Http协议发送的请求, 是一次性连接
    • 做法: 客户端主动通过 http 请求向服务器获取数据, 服务器响应请求 把数据回传给用户 -- 到此结束
  • websockt: 长链接
    • 客户端主动与服务器交互, 交互后要留下联系方式 -- 服务器可以随时随地的与客户端进行交互

三、服务器搭建

  • 文件夹: chat-server
  • 初始化: npm init -y
  • 安装模块: npm i cors express socket.io

客户端需要使用 socket 模块 为其特殊准备的脚本来实现长链接

脚本位置如下: 把其复制到 public 目录里使用

 

 

const express = require('express');
// 在 express 上, 加装 socket 模块, 实现长链接
const cors = require('cors');
const http = require('http');
const socket = require('socket.io');

const app = express()
// express 本身和 scoket 都属于服务器, 互相不兼容
// 利用 createServer 封装成一个 兼容性更好的服务器
const server = http.createServer(app)

// 把 socket 长链接服务器 也放到 server 里
const io = new socket.Server(server, {
  cors: { origin: '*' } //允许跨域访问
})

// 监听利用 socket 长链接方式 访问的用户
// connection: 连接事件, 当有用户来访时, 会自动触发
io.on('connection', user => {
  console.log('user:', user)

  // 监听用户发送的消息:
  user.on('msg', msg => {
    console.log('来自用户的消息', msg)

    // 回复信息:
    // 假设用户说: 你好,    我们回复 你好,有什么需要帮助的?
    if (msg.indexOf('你好') != -1) {
      // 发消息: emit
      user.emit('reply', '你好,有什么需要帮助的?')
    }

    if (msg.indexOf('手机') != -1) {
      user.emit("reply", '联系方式 18822323333')
    }

    if (msg.indexOf('优惠') != -1) {
      user.emit("reply", '20年店庆大促销, 全场 5折起')
    }
  })

  // 每隔 2s 给用户主动发消息
  // emit: 用于给用户发消息
  // 参数1: 消息名   参数2: 消息体
  // setInterval(() => {
  //   user.emit('ad', '好消息, 好消息, 20周年庆典 全场5折优惠!!')
  // }, 2000);
})

app.use(express.static('public'))
app.use(cors()) // express 服务器 允许跨域

server.listen(3000, () => {
  console.log('服务器已开启!')
})
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>首页</title>

  <style>
    #box {
      width: 400px;
      display: flex;
      flex-direction: column;
    }

    #box>ul {
      margin: 0;
      padding: 0;
      height: 400px;
      overflow-y: scroll;
      background-color: #eee;
    }

    #box>ul>li.you {
      display: flex;
      flex-direction: column;
      align-items: flex-end;
    }
  </style>
</head>

<body>
  <h1>欢迎使用 websocket</h1>
  <!-- 搭建socket 连接, 需要官方提供的 客户端脚本 -->

  <div id="box">
    <ul>
      <!-- <li>
        <h3>人名</h3>
        <p>文字信息</p>
      </li> -->
    </ul>
    <textarea cols="30" rows="4"></textarea>
    <button>发送消息</button>
  </div>


  <script src="./socket.io.min.js"></script>
  <script src="./jquery-3.6.1.min.js"></script>

  <script>
    // 脚本中提供了与服务器搭建长链接的方法
    // io方法: 是脚本中提供的, 专门负责与服务器搭建链接

    // 链接到服务器后, 会得到服务器的详细信息
    const server = io('http://localhost:3000')

    // 利用 on 方法, 监听服务器发送的消息
    // 参数1: 消息名, 由服务器发消息时设定
    // 参数2: 回调函数, 接到的消息体
    server.on('ad', msg => {
      console.log(msg)
    })

    // 点击发送按钮, 获取输入框中的值, 发送给服务器
    $('#box>button').on('click', function () {
      var msg = $('#box>textarea').val()
      if (msg == '') return

      $('#box>textarea').val('') //清空值

      $('#box>ul').append(`<li class="you">
        <h3>你:</h3>
        <p>${msg}</p>
      </li>`)

      // 自动滚动到最底部
      // 设置其滚动距离 是可以滚动的最大距离
      var maxHeight = $('#box>ul').prop('scrollHeight')
      $('#box>ul').scrollTop(maxHeight) //设置滚动距离

      // 给服务器发消息
      // emit: 发送
      // 参数1: 消息名     参数2: 值
      server.emit('msg', msg)
    })

    // 监听服务器回复的消息
    server.on('reply', msg => {
      console.log('服务器回复:', msg)

      $('#box>ul').append(`<li>
        <h3>官方旗舰店:</h3>
        <p>${msg}</p>
      </li>`)
    })
  </script>
</body>

</html>

四、聊天室

  • 创建新的服务器
    • 新建文件夹 : chat-home
    • 初始化 : npm init -y
    • 安装: npm i express cors socket.io
const cors = require('cors');
const socket = require('socket.io');
const express = require('express');
const http = require('http');

const app = express()

const server = http.createServer(app)

const io = new socket.Server(server, {
  cors: { origin: '*' }
})

io.on('connection', function (user) {
  // 上节课: 给连接的用户发消息
  // user: 代表当前链接的用户
  user.emit('消息名', '消息详情')

  // 群发: 给所有链接到服务器的用户发消息
  io.emit('消息名', '消息详情')
})

app.use(express.static('public'))
app.use(cors())

server.listen(3000, function () {
  console.log('服务器已开启');
})
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>聊天室</title>
  <style>
    #users {
      display: flex;
      margin: 0;
      padding: 0;
      list-style: none;
      flex-direction: column-reverse;
      height: 300px;
      overflow-y: scroll;
      width: 200px;
    }

    #box {
      width: 400px;
      display: flex;
      flex-direction: column;
    }

    #box>ul {
      padding: 10px;
      margin: 0;
      padding: 0;
      height: 400px;
      overflow-y: scroll;
      background-color: #eee;
    }

    #box>ul>li.you {
      display: flex;
      flex-direction: column;
      align-items: flex-end;
    }

    #box>ul>li>p {
      padding: 10px;
      margin: 0;
      background-color: green;
      color: white;
      border-radius: 4px;

    }
  </style>
</head>

<body>
  <h1>欢迎来到WEB2208聊天室</h1>

  <ul id="users" style="display: none;"></ul>

  <div id="box">
    <ul></ul>
    <textarea cols="30" rows="4"></textarea>
    <button>发送消息</button>
  </div>


  <script src="./jquery-3.6.1.min.js"></script>
  <script src="./socket.io.min.js"></script>
  <script>
    // 非 https 的
    const server = io('chathome.xin88.top')

    // 接收欢迎信息
    server.on('welcome', msg => {
      console.log(msg)
    })

    // 发送个人信息到服务器
    server.emit("profile", { uname: '小新', age: 32, phone: '10086' })

    // 监听新用户信息
    server.on('new_user', data => {
      console.log('新用户:', data)

      $('#users').append(`<li>${data.uname}</li>`)
    })

    // 点击发送时
    $("#box>button").click(function () {
      // 消息格式规定:
      // { uname:用户名, msg:"信息内容"}

      // 获取输入框的值, 发消息到服务器即可
      var msg = $('#box>textarea').val()
      $('#box>textarea').val('') //清空

      server.emit("msg", { uname: "小新", msg })
    })

    // 接收消息:  显示到 ul 里即可
    server.on('msg', data => {
      console.log(data)

      $('#box>ul').append(`<li>
          <h3>${data.uname}</h3>
          <p>${data.msg}</p>
        </li>`)

      $('#box>ul').scrollTop($('#box>ul').prop('scrollHeight'))
    })
  </script>
</body>

</html>

五、defineProperty

5.1.初识defineProperty

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>defineProperty 15:01</title>
</head>

<body>
  <!-- defineProperty 是一个 精确配置 对象属性的 API -->
  <!-- 主要用于开发 完善的框架时使用 -->

  <script>
    // 开启严格模式
    // 特点: 取消静默失败,  失败的操作会报错
    'use strict'

    var emp = {
      ename: "泡泡",
      age: 18,  // 年龄
      eid: '000235', //员工编号
      salary: 23000, //薪资 -- 希望不要被遍历
    }


    // 精确详细的 为对象中的属性, 添加限定
    // define:规定, 定义    property: 属性
    Object.defineProperty(emp, 'eid', {
      // ctrl + i :看提示
      // 希望 eid 不要被写入新的值
      writable: false, // 是否可以被写入值:  false代表不可以
    })

    Object.defineProperty(emp, 'ename', {
      writable: false
    })

    // 薪资属性 不要被 for.in 遍历
    Object.defineProperty(emp, 'salary', {
      // 可枚举的, 可遍历的
      enumerable: false

      // 浏览器会把 不可遍历的属性, 用浅色表示
    })

    // 看代码有何问题
    emp.age = 180 // 赋值的逻辑错误
    // emp.eid = true // 员工编号不应该被修改
    // emp.ename = '哈哈' // 名字不允许改

    for (const key in emp) {
      console.log(key, emp[key])
    }

    console.log(emp);
  </script>
</body>

</html>

5.2.配置多个属性

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>defineProperty 15:36</title>
</head>

<body>
  <script>
    'use strict'

    var phone = {
      name: "iPhone14",
      price: 9999,
      maker: 'Apple',
    }

    // 需求1: 让3个属性都不可以被修改值
    // Object.defineProperty(phone, 'name', { writable: false })

    // Object.defineProperty(phone, 'price', { writable: false })

    // Object.defineProperty(phone, 'maker', {
    //   writable: false,
    //   enumerable: false
    // })

    // 合写:  利用  defineProperties 可以一次性给对象配置多个属性
    Object.defineProperties(phone, {
      // 属性名: { 配置项 }
      name: { writable: false },
      price: { writable: false },
      maker: { writable: false, enumerable: false }
    })

    // 需求2: 让 maker 属性 不可遍历


    // phone.name = '0 0 0' //报错
    // phone.price = 3 // 报错
    // phone.maker = '444' //报错

    for (const key in phone) {
      console.log(key, phone[key])
    }


  </script>
</body>

</html>

5.3.可配置

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>defineProperty 16:16</title>
</head>

<body>
  <script>
    'use strict'

    var emp = {
      ename: "泡泡",
      husband: '大连' // 丈夫
    }

    Object.defineProperty(emp, 'husband', {
      // 可配置的
      configurable: false  //不可以重新配置, 例如 删除
    })

    // defineProperty 也可以为对象新增属性 -- 但是其新增的属性权限都是最低的
    // 不可删 不可改 不可遍历
    // 当定义的属性不存在, 则自动转为新增操作
    Object.defineProperty(emp, 'age', {
      value: 18, //赋值
    })

    // delete emp.age

    // emp.age = 2000

    for (const key in emp) {
      console.log(key, emp[key])
    }

    // delete : 删除对象的属性
    // delete emp.husband

    console.log(emp)
  </script>
</body>

</html>

5.4.赋值监听

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>defineProperty 16:29</title>
</head>

<body>
  <script>
    var emp = { ename: "泡泡", age: 18 }

    // 逻辑有问题, 赋值错误 -- 报错
    Object.defineProperty(emp, 'age', {
      // set: 设置
      // 当给属性 赋值时触发:  = 赋值符号
      set: function (value) {
        console.log('value:', value)
        // 判断: 合理的年龄范围 1 - 120
        if (value >= 1 && value <= 120) {

        } else {
          //抛出报错
          throw Error('age的赋值错误, 请检查:' + value)
        }
      }
    })

    emp.age = 200

    console.log(emp)
  </script>
</body>

</html>

5.5.练习

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>练习 16:43</title>
</head>

<body>
  <script>
    var stu = {
      sname: "凯凯",
      phone: '19848485444',
      age: 33,
    }

    Object.defineProperties(stu, {
      age: {
        // 语法糖: 可以省略 : function
        // set: function(){}
        set(value) {
          if (value >= 1 && value <= 100) { } else {
            throw Error("age赋值错误" + value)
          }
        }
      },
      phone: {
        set(value) {
          if (/^1[3-9]\d{9}$/.test(value)) { } else {
            throw Error("phone赋值错误" + value)
          }
        }
      },
      sname: {
        set(value) {
          if (typeof value == 'string') { } else {
            throw Error("sname赋值错误, 必须字符串类型" + value)
          }
        }
      }
    })

    // stu.age = 200 //报错:  合理范围 1 - 100
    // stu.phone = '10086' // 报错: 不是手机号格式; 正则 /^1[3-9]\d{9}$/
    stu.sname = 666 // 要求必须字符串类型,   用typeof 来判断类型
  </script>
</body>

</html>

5.6.计算属性

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>defineProperty 17:21</title>
</head>

<body>
  <!-- 计算属性 -->
  <script>
    // 矩形对象
    var r1 = {
      width: 100,
      height: 40,
      // 计算属性: 当添加 get 关键词在函数前
      // 函数在使用时, 必须 省略();  JS会自动触发函数
      // 此时函数使用时的格式, 就如同在读取普通的属性 -- 计算属性
      // 总结: 书写 get  使用时少写()
      get area() {
        return this.width * this.height
      },
      // 这个 get 是语法糖
      get zc() {
        return (this.width + this.height) * 2
      }
    }

    console.log(r1.zc);
    console.log(r1.width);
    console.log(r1.area);
    console.log(r1.area);
    console.log(r1.area);

    // 完整格式
    Object.defineProperty(r1, 'area1', {
      // 当读属性的值时, 自动触发
      get: function () {
        return this.width * this.height
      }
    })

    console.log('area1:', r1.area1) // 不用() 就能触发
  </script>
</body>

</html>
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>defineProperty 17:40</title>
</head>

<body>
  <!-- 赋值监听的完整操作 -->
  <script>
    var emp = { ename: '泡泡', age: 18 }

    Object.defineProperty(emp, 'age', {
      // 计算属性, 不需要() 就能触发
      // emp.age
      // 类似于 去柜台取钱, 员工到金库取钱出来 给你
      get() { return this._age },


      set(value) {
        if (value >= 1 && value <= 120) {
          // 合法就赋值
          console.log('合法的年龄, 进行赋值');
          // 问题: 赋值会触发 age 的 set 监听, 触发无限循环

          // 由于age属性负责检测赋值, 所以不再具有存值功能
          // 需要一个额外的变量来存值, 习惯上用 _age, 带有_ 前缀进行区分
          this._age = value
        } else {
          throw Error("age赋值错误 " + value)
        }
      }
    })

    // emp.age = 200 // 报错: 合理范围 1 - 120


    // 站在使用者的角度
    // 从表面现象看:  40 是存放在 age 属性的
    emp.age = 40 //正常

    console.log(emp)
    // 读取时: 就应该从 age 中读取, 而不是 莫名其妙的 _age
    // console.log(emp._age)
    console.log(emp.age) // 可以触发 get 计算属性
  </script>
</body>

</html>


总结

HTML5CORE04学习结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/114537.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PCB贴片机如何送料?

1.常见的贴片机供料器四种形式 http://www.sz-bjzn.com/1547.html 2.模块化设计SMT贴片机送料器的操作方法 3.淘宝 https://item.taobao.com/item.htm?spma230r.1.14.98.33e41823OZ1zzn&id579043582781&ns1&abbucket20#detail 不错&#xff1a;https://item.tao…

distinct与group by 去重

distinct与group by 去重distinct 特点&#xff1a;group by 特点&#xff1a;总结&#xff1a;mysql中常用去重复数据的方法是使用 distinct 或者group by &#xff0c;以上2种均能实现&#xff0c;但也有不同的地方。distinct 特点&#xff1a; 1、distinct 只能放在查询字段…

重新更新anaconda

更新anaconda问题阐述问题分析打开Anaconda Nvaigator打开文件所在位置复制文件所在路径找到此电脑或者打开设置找到高级系统设置环境变量添加环境变量打开scripts文件修改成功再一次启动感谢观看今天手贱,不小心删掉的anaconda,我想一不做二不休,直接重新重装了,就找到了anaco…

经典SQL语句大全(基础、提升、技巧、数据开发、基本函数)

目录 前言 正文 第一章&#xff1a;基础 第二章&#xff1a;提升 第三章&#xff1a;技巧 第四章&#xff1a;数据开发-经典​​​​​​​ 第五章&#xff1a;SQL Server基本函数 第六章&#xff1a;常识 第七章&#xff1a;SQLServer2000 同步复制技术实现步骤 总结…

juc-4-synchronized原理

目录 1、synchronized 作用于静态方法 总结 ​编辑 案例 静态成员变量 (synchronized锁非静态方法) 案例 静态成员变量 (synchronized锁静态方法 或 直接锁类) 2、监视器锁(monitor) 2.1 synchronized怎么实现的线程安全呢&#xff1f; 3、JDK6 synchronized 的优化 3.1 C…

互联网技术不再是统领,当下正在发生着一场深刻的变革

拥抱实体经济&#xff0c;绝对是当下互联网玩家们的首要选择。无论是头部的互联网企业来讲&#xff0c;还是新生的互联网玩家而言&#xff0c;它们都不约而同地将关注的焦点聚焦在了这样一个方向上。   透过这一点&#xff0c;我们可以非常明显地感受到&#xff0c;一个全新的…

圣诞节,记录前行中跨过的2022

2022年&#xff0c;我人生的第二十四年&#xff0c;是我大学生活的最后一年&#xff0c;是我职场生涯的第一年&#xff0c;这一年从学生到打工人&#xff0c;从实习生到职场员工&#xff0c;变化了许多&#xff0c;做了许多&#xff0c;收获了许多&#xff0c;同时也成长了许多…

m自适应FSK解调系统误码率matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 FSK信号的解调也有非相干和相干两种&#xff0c;FSK信号可以看作是用两个频率源交替传输得到的&#xff0c;所以FSK的接收机由两个并联的ASK接收机组成。 (1)相干解调 相干解调是利用乘法器&…

Minecraft(我的世界) Fabric 1.19.3 服务器搭建教程

Debian系统使用MCSManager9面板搭建MC Java版MOD服务器的教程&#xff0c;本教程用的Fabric1.19.3服务端&#xff0c;用其他服务端的也可以参考一下。 视频教程&#xff1a;https://www.bilibili.com/video/BV1Zd4y1h7zG/ 我的世界(MC) Fabric 1.19.3 开服教程&#xff0c;新手…

IDEA Git 选项栏各项功能详解

IDEA Git 选项栏各项功能详解 如图所示 Copy Revision Number 顾名思义 拷贝当前版本号 到剪切板 a8e4b86ce9ca01968629504a6e19b4b99d76a853 Create Patch 在 git 日志中选择要创建补丁的commit&#xff0c;右键选择Create Patch...同一个文件在多次commit中都存在&#xff…

DSP-离散时间系统

目录 概念&#xff1a; 累加器(Accumulator)&#xff1a; N点滑动滤波器&#xff1a; 离散时间系统的分类 &#xff1a; 线性系统 Linear System 移不变系统 Shift-Invariant Systems 因果系统 Causal System 稳定系统 Stable System 无源&#xff08;passive&#x…

蚂蚁感冒(第五届蓝桥杯省赛C++A/B组)

目录 题目详细&#xff1a;​编辑 题目思路&#xff1a; 两种情况&#xff1a; 代码详解&#xff1a; 题目详细&#xff1a; 题目思路&#xff1a; 这个题目的关键在于对蚂蚁相遇 的时候情况的看待 两个蚂蚁相遇时候的情况 我们可以看作 他们相互穿过了彼此 假设相遇…

基于CNN的MINIST手写数字识别项目代码以及原理详解

文章目录项目简介项目开发软件环境项目开发硬件环境前言一、数据加载的作用二、Pytorch进行数据加载所需工具2.1 Dataset2.2 Dataloader2.3 Torchvision2.4 Torchtext2.5 加载项目需要使用的库三、加载MINIST数据集3.1 数据集简介3.2 数据预处理3.3 加载数据集四、模型构建五、…

【分布式技术专题】「架构实践于案例分析」总结和盘点目前常用分布式事务特别及问题分析(Seata-终)

分布式事务中间件对⽐与选择 tx-lcnEasyTransactionByteTCCSeata Seata实现分布式事务 我们主要以Seata的分布式事务框架进行介绍分析&#xff0c;相关的并且针对于其三种模式进行分别说明介绍。 搭建Seata Server 前往https://github.com/seata/seata/releases 下载Seata安装…

TCP通信

目录 一.服务端 1.1创建套接字与绑定 1.2监听 1.3服务端获取连接 1.4服务端提供服务 二.客户端 2.1创建套接字 2.2客户端获取连接 2.3客户端发送需求 三.填充命令行参数 3.1客户端 3.2服务端 3.3结果测试 四.线程版本服务端 4.1线程版 4.2线程池版 一.服务端 与上文…

程序员过圣诞 | 用HTML写出绽放的烟花

文章目录一、前言二、创意名三、效果展示四、烟花代码五、总结一、前言 2022年圣诞节到来啦&#xff0c;圣诞节是基督教纪念耶稣诞生的重要节日。亦称耶稣圣诞节、主降生节&#xff0c;天主教亦称耶稣圣诞瞻礼。耶稣诞生的日期&#xff0c;《圣经》并无记载。公元336年罗马教会…

【博客567】http/2 goaway frame 与 grpc graceful restart

http2 goway frame 与 grpc graceful restart 1、http/2 HTTP/2新增特性 二进制分帧(HTTP Frames)多路复用头部压缩服务端推送(server push)等等新特性 二进制分帧(HTTP Frames)是实现一流多用的基础 HTTP/2最革命性的原因就在于这个二进制分帧了&#xff0c;要了解二进制…

Win10 21H2 19044+vs2019 WDK驱动开发,错误 MSB8040缓解Spectre 漏洞的库以及输出SXS.DLL的垃圾信息

错误 MSB8040缓解Spectre 漏洞的库以及输出SXS.DLL的垃圾信息&#xff0c;win7关闭驱动签名、进入驱动测试模式缓解Spectre 漏洞错误的解决windbg狂刷输出SXS.DLL的垃圾信息的解决缓解Spectre 漏洞错误的解决 在工程配置属性&#xff0c;常规&#xff0c;输出目录&#xff0c;…

SSD_学习笔记记录

one-steage VGG16模型的修改 VGG16的模型输出&#xff0c;其中224.。。为特征图的大小。 SSD模型中对VGG网络的修改&#xff1a; SSD模型是对VGG中的第四个卷积块中的最后一个Conv2d进行第一个输出&#xff0c;在这里简称为Conv4-3。以及第五个卷积块中的最后一个Conv2d进行…

TCP 的可靠传输(计算机网络-运输层)

TCP的可靠传输 因特网的网络层服务是不可靠的 TCP在IP的不可靠的&#xff1a;尽最大努力服务的基础上实现了一种可靠的数据传输服务 TCP采用的可靠传输机制&#xff1a;差错检测、序号、确认、超时重传、滑动窗口等 互联网环境中端到端的时延往往是比较大的&#xff1a;采用…