您的位置:首页 > 娱乐 > 明星 > microsoft免费网站_360浏览器网页版_口碑优化seo_链接怎么做

microsoft免费网站_360浏览器网页版_口碑优化seo_链接怎么做

2025/4/19 17:25:05 来源:https://blog.csdn.net/qq_27302885/article/details/147191093  浏览:    关键词:microsoft免费网站_360浏览器网页版_口碑优化seo_链接怎么做
microsoft免费网站_360浏览器网页版_口碑优化seo_链接怎么做

目录

1.知识点概述

2.openssl rsa内存释放

3.json介绍

4.json数组和json对象

5.写json文件注意事项

6.vs下jsoncpp库的生成

7.linux下jsoncpp环境搭建

8.jsoncpp中value类api

9.jsoncpp中reader类

10.jsoncpp中fasterwrite类

11.组织json数据写磁盘

12.jsoncpp测试

13.秘钥协商客户端需求分析

14.秘钥协商客户端操作流程

15.秘钥协商服务器端业务数据分析

16.秘钥协商服务器业务流程

17.任务

18.在vs编写linux项目需要设置的一些属性


1.知识点概述

```json
1. Json是什么?
    - 不是语言, 跟语言无关
    - 是数据的一种描述形式, 以某种格式将数据组织起来
        - 写磁盘文件 -> 配置文件
            - 在应用程序启动的时候, 需要加载少量数据, 初始化应用程序
                - 登录的用户名, 密码
                - 远程数据库连接
                - 连接的远程服务器地址
                - 让程序更加灵活
        - 网络发送   -> 报文
            - 对数据进行序列化

2.openssl rsa内存释放

2. json的如何组织数据?
    - json数组 -> 
        - 类似 C++ 中的数组, []表示, 元素之间使用逗号间隔
        - 区别: json的数组的数据类型可以不同
        - 注意事项事项: 最后一个元素后边不要写逗号, 否则会解析失败
        - 可包含的数据类型: [int, double, float, bool, string, char*, json数组, json对象]
        - 举例:
            [12, 13.45, "hello, world", true, false, [1,2,"aa"], {"a":"b"}]
    - json对象
        - 使用{}表示
        - 分为两部分, key: value
            - 键值对之间使用都被间隔, 最后一个键值对后边不要写逗号, 否则会解析失败
            - key: 必须是字符串, 对要存储的数据的描述
            - value: 要保存的数据, 数据格式可以有多种: 
                - 整形, 浮点, 字符串, 布尔, json数组, json对象
        - 例子:
            {
                "name":"蕾蕾",
                "age":12,
                "sex":"man",
                "婚否":flase,
                "falily":["爸爸", "妈妈", "弟弟"],
                "资产":{
                    "car":"BMW",
                    "房子":"北京故宫"
                }
            }

    - 以上两种格式可以嵌套使用
```

3.json介绍

## 1.1 安装

- windows 下的安装

  - 在windows下 将 `jsoncpp-0.10.7.tar.gz`解压缩

  - 进入到解压目录`jsoncpp-0.10.7`, 在进入到子目录`makefiles\msvc2010`

  - 使用`vs`打开项目文件`jsoncpp.sln`

  - 编译该项目, 生成库文件

    ![1567304880789](assets/1567304880789.png)

  - 生成的静态库存储目录`jsoncpp-0.10.7\makefiles\msvc2010\Debug`

  - 生成的静态库文件: `lib_json.lib`

  - 使用的准备工作:

    - 将静态库`lib_json.lib`拿出备用
    - 将库对应的头文件拿出, 头文件目录`jsoncpp-0.10.7\include\json`

  - vs编译过程中, 修改属性

    ![1567311254954](assets/1567311254954.png)

4.json数组和json对象

5.写json文件注意事项

- Linux 下的安装

  - 准备安装包

    - `jsoncpp-0.10.7.tar.gz`
    - `scons-3.0.5.zip`

  - 解压缩

    ```shell
    $ tar zxvf jsoncpp-0.10.7.tar.gz
    $ unzip scons-3.0.5.zip
    ```

  - 安装scons -> 进入 `scons-3.0.5.zip` 的解压目录

    ```shell
    $ python setup.py install 
    ```

  - 安装 jsoncpp -> 进入 `jsoncpp-0.10.7.tar.gz` 的解压目录

6.vs下jsoncpp库的生成

    ```shell
    $ scons platform=linux-gcc 
    # 将生成的动态库/静态库拷贝到系统的库目录中, 需要管理员权限
    $ cp libs/linux-gcc-4.8.5/* /lib
    # 拷贝json的头文件到系统目录中, 需要管理员权限
    $ cp include/json/ /usr/include/ -r
    # 创建动态库的链接文件, 需要管理员权限
    ln -s /lib/libjson_linux-gcc-4.8.5_libmt.so /lib/libjson.so
    # 更新, 这样才能搜索到动态库 libjson.so。需要管理员权限
    $ ldconfig    
    # 测试
    $ ./bin/linux-gcc-4.8.5/test_lib_json 
    Testing ValueTest/checkNormalizeFloatingPointStr: OK
    Testing ValueTest/memberCount: OK
    Testing ValueTest/objects: OK
    Testing ValueTest/arrays: OK
    ..................
    Testing BuilderTest/settings: OK
    Testing IteratorTest/distance: OK
    Testing IteratorTest/names: OK
    Testing IteratorTest/indexes: OK
    All 53 tests passed
    ```

7.linux下jsoncpp环境搭建

 - 编译 c++ 测试文件: json-test.cpp

    ```shell
    $ g++ json-test.cpp -ljson -o json
    ```

## 1.2 jsoncpp类的使用

- Value -> 对Json支持的数据类型进行封装/解析

  ```c++
  // Json支持的数据类型
  Type = {int, double, float, string, char*, bool, JsonArray, JsonObject}
  // 构造函数
    Value(ValueType type = nullValue);
    Value(Int value);
    Value(UInt value);
  #if defined(JSON_HAS_INT64)
    Value(Int64 value);
    Value(UInt64 value);
  #endif // if defined(JSON_HAS_INT64)
    Value(double value);
    Value(const char* value); ///< Copy til first 0. (NULL causes to seg-fault.)
    Value(const char* begin, const char* end);

8.jsoncpp中value类api

 // 将Value对象转换成对应类型的数据
    Int asInt() const;
    UInt asUInt() const;
  #if defined(JSON_HAS_INT64)
    Int64 asInt64() const;
    UInt64 asUInt64() const;
  #endif // if defined(JSON_HAS_INT64)
    LargestInt asLargestInt() const;
    LargestUInt asLargestUInt() const;
    float asFloat() const;
    double asDouble() const;
    bool asBool() const;

9.jsoncpp中reader类

 // 判断Value对象中存储的数据的类型
    bool isNull() const;
    bool isBool() const;
    bool isInt() const;
    bool isInt64() const;
    bool isUInt() const;
    bool isUInt64() const;
    bool isIntegral() const;
    bool isDouble() const;
    bool isNumeric() const;
    bool isString() const;
    bool isArray() const;
    bool isObject() const;
  
  // 取值 
  // 格式化 -> 将对象转换为字符串
  // 适合于查看信息或者写文件
  std::string toStyledString() const;
  
  ```

10.jsoncpp中fasterwrite类

- Reader

  ```c++
  // json格式字符串 -> Value对象
  // c++
  bool parse(const std::string& document, Value& root, bool collectComments = true);
      参数:
          - document: json字符串, 传入参数
          - root: 传出参数, 转换完成之后的Value对象
  // c用法
  bool parse(const char* beginDoc, const char* endDoc, 
             Value& root, bool collectComments = true);
      参数:
          - beginDoc: 字符串起始地址
          - endDoc: 字符串结束地址
          - root: 传出参数, 转换完成之后的Value对象
  // c++用法
  bool parse(std::istream& is, Value& root, bool collectComments = true);
      参数:
          - is: 文件流对象, 使用这个流对象打开一个磁盘文件
          - root: 传出参数, 转换完成之后的Value对象
  ```

11.组织json数据写磁盘

- FastWriter

  ```c++
  // 将Value对象中的数据格式化 -> 字符串
  // 适合于网络数据的发送
// 得到的字符串中没有换行符
  std::string write(const Value& root);
  
  // 得到这个返回值:
      - 写磁盘 -> 写到配置文件中
      - 网络传参数
  ```

12.jsoncpp测试

13.秘钥协商客户端需求分析

 客户端的配置文件

  ```json
  // clientID, serverID, IP, Port
  {
      "clientID":"bj_tbd_001",
      "serverID":"bj_gugong_001",
      "serverIP":"127.0.0.1",
      "ServerPort":8888
  }
  ```

14.秘钥协商客户端操作流程

- 客户端的实现:

  - 在客户端发起请求
    - 秘钥协商
    - 秘钥校验
    - 秘钥注销
  - 客户端需要提供和用户交互的功能
  - 客户端和服务器通信需要携带数据
    - 通信的业务数据
    - 鉴别客户端身份的数据 -> 客户端的ID
    - 和客户端通信的服务器ID
    - 需要一个标记 -> 服务器根据这个标记判定客户端要请求做什么事儿 -> 事先约定好即可
      - 1 -> 秘钥协商
      - 2 -> 秘钥校验
      - 3 -> 秘钥注销
    - 给对方提供校验数据, 判断数据块是不是被修改了
      - 签名 -> RSA签名

15.秘钥协商服务器端业务数据分析

- 数据分析

  ```c++
  //客户端使用的结构体
  struct RequestMsg
  {
      int cmdType;    
      string clientID;
      string serverID;
      string sign;
      string data; 
  };
  
  message RequestMsg
  {
      int32 cmdType=1;    
      bytes clientID=2;
      bytes serverID=3;
      bytes sign=4;
      bytes data=5; 
  }

16.秘钥协商服务器业务流程

 // 数据分析
  cmdType: 发送给服务器的数据, 服务器需要对去进行判断:
      - 1 -> 秘钥协商
      - 2 -> 秘钥校验
      - 3 -> 秘钥注销
  clientID: 所有有效的客户端都会被分配给一个有效的唯一的ID
  serverID: 客户端要连接的服务器对应的ID
  data: 对应的业务数据, 根据cmdType不同而不同
  sign: 签名, 对data签名
  ```

17.任务

- 秘钥协商客户端通信流程

  - 提供一个能够和用户交互的界面
  - 用户选择的秘钥协商
  - 组织数据, 初始化`struct RequestMsg`
    - `cmdtype` = 1
    - `clientID` = `读配置文件`
    - `serverID` = `读配置文件`
    - `data` = `非对称加密的公钥`
    - `sign` = `data的签名`
  - 对数据`struct RequestMsg`进行序列化 -> 字符串
    - `protobuf` 对应的类
  - 数据发送给服务器
    - 套接字通信的类也封装好了 - `TcpSocket`
      - 创建一个通信对象
      - 连接服务器
        - `服务器IP, 服务器端口` == > 来自与配置文件
      - 给服务器发送序列化之后的数据
      - 接收数据 (默认是阻塞的)-> 等待服务器回复数据 
      - 接收到了服务器回复的数据 -> `反序列化`
        - 使用封装的序列化类就可以完成此操作
      - 得到了原始数据
        - 将对此加密的秘钥进行解析 -> 这是公钥加密的数据
          - 通过私钥解密 -> 原始的对称加密的秘钥

18.在vs编写linux项目需要设置的一些属性

# 3. 秘钥协商服务器

- 被动接受客户端请求, 不需要和用户进行交互
  - 可以是以守护进程
  - 接收客户端请求, 处理 -> 给客户端回复数据
    - 请求的处理状态
    - 针对业务逻辑处理得到的业务数据
    - 

- 数据分析

  ```c
  // 服务器给客户端回复的数据
  struct RespondMsg
  {
      bool status;
      int seckeyID;
      string clientID;
      string serverID;
      string data;
  };
  status: 客户端请求的处理状态
  data:     实际的业务数据
  clientID: 秘钥协商客户端的ID
  serverID: 秘钥协商服务器的ID
  seckeyID: 只要在秘钥协商生成新秘钥的时候才有用

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com