• TCP_DB_中间件_数据打包格式


    ZC: 这里约定的是,C和S之间 传输的TCP数据包的格式

    1、TCP数据包 打包格式

      1.1、TCP包长度(int32) + TCP包序号(int32) + TCP包类型(int32) + TCP包内容

        1.1.1、长度说明:这里的“TCP包长度”是包含 TCP包头 和 TCP包内容 的总的长度

      ZC: 实际上 TCP包头 只要 “TCP包长度”就可以了,后面跟的都是 TCP包内容,这样才是 脱离业务逻辑的更为通用的处理方式

    2、数据库结果集 打包格式

      2.1、结果集头

        2.1.1、总长度(int32) + 列数(int32) + 行数(int32) + 各个列的类型(int32 * N) + 各个列的名称([长度+内容] * N)

        2.1.2、长度说明:这里的“总长度”是 包含 结果集头 和 结果集内容 的总的长度

      2.2、结果集内容

        2.2.1、从ResultSet的第1个Row开始,一直到最后1个Row,从第1个Column到最后1个Column 的顺序 安放数据。

          即 内存中安放的格式为:(ResultSet中 共有 M行N列结果)

            第1行第1列,第1行第2列,... ...,第1行第N列

            第2行第1列,第2行第2列,... ...,第2行第N列

            ... ...

            第M行第1列,第M行第2列,... ...,第M行第N列

        2.2.2、第?行第?列 的结果 的格式:

          长度+内容

          2.2.2.1、长度说明:这里的“长度” 仅仅是指 后面跟着的“内容”的长度,不包括自身的4字节

    3、C/S之间,管理数据包的 数据格式 (这是 我写的 用于获取/管理 C/S 信息的功能,并非 C/S之间的业务逻辑数据)

     3.1、获取所有连在S上的C的地址信息(SocketAddress) (这个是JAVA程序中得到的信息,只是简单的信息 没有MAC等 就算有 也是 映射过的MAC/IP/Port)

      3.1.1、C-->S: 发送TCP包头信息(OP_TYPE_MANAGE_CLIENTS)

      3.1.2、S-->C: TCP包头 + S返回信息时的时间[int64] + 所有客户端地址信息(单个客户端的地址信息 在内存中 连续存放)

       单个客户端的地址信息(3个部分):(1)、该TremoteClient 最后一次使用的时间[int64] (2)、该客户端地址信息的长度[int32] (3)、该客户端地址信息

        长度说明:这里的“客户端地址信息的长度”仅仅是“客户端地址信息”的长度,不包括自身的4字节

     3.2、向S请求某C的信息:(这是让 ClientB返回它自己机子上的MAC/IP/Port等 信息)

      3.2.1、向S请求某C的 地址信息(MAC/IP 等)

       ClientA选择 某一个S返回的 ClientB地址信息(SocketAddressB) 发送到S,S 通过SocketAddressB找到ClientB,然后 向ClientB 请求它的详细地址信息

        ZC: 下面 将 TCP包头省略了 (OP_TYPE_MANAGE_SOCKET_REQ)

       (1)、ClientA-->S: SocketAddressB的长度 + SocketAddressB信息

       (2)、S-->ClientB: SocketAddressB的长度 + SocketAddressB信息 + SocketAddressA的长度 + SocketAddressA信息

        ZC: 这里S在ClientA发来的数据后面加了一段,这是用于 ClientB返回信息的时候 能够找到ClientA

       (3)、ClientB-->S: 地址信息 + S发来的信息

        (3.1)、地址信息 : 地址信息的长度[int32] + 地址信息的内容

         长度说明:“地址信息的长度” 是 4字节 + 地址信息内容的长度

         (3.1.1)、地址信息的内容:IP地址的长度+IP地址 + MAC的长度+MAC

          长度说明:“IP地址的长度”、“MAC的长度”都是 4字节+后面内容的长度

       (4)、S-->ClientA: 通过 SocketAddressA 找到 ClientA,将ClientB发来的数据 去掉SocketAddressA的部分之后 发给 ClientA

      3.2.2、向S请求某C的 内存信息(分配的各种内存的信息[大小/用途 等])

       ZC: 基本流程和 上面一样,下面只讲 不同的部分

       (3)、ClientB-->S: 内存信息 + S发来的信息

        (3.2)、内存信息 : 内存信息的长度 + 当前时间(GetTickCount) + 内存信息的内容

         长度说明:“内存信息的长度”是 4字节+后面内容的长度

         (3.2.1)、内存信息的内容:各个内存块的信息 在内存中连续存放

          单个内存块的信息:5个integer 共20字节,分别为:

           (A)、内存块总长
           (B)、有效数据的开始偏移
           (C)、有效数据的长度
           (D)、内存块类型[是干嘛用的:接收TCP数据包/业务逻辑SQL数据/推送数据 等,对应各OP_TYPE_???]
           (E)、最后一次申请该内存块时的时间(GetTickCount)

     3.3、向S提交SQL语句,并返回执行结果

    4、

    5、

  • 相关阅读:
    [Qt] 文本文件读写, 摘自官方文档
    [Windows] Socket Server Failed to bind, error 10048
    lodctr /R 失败的情况
    ModuleNotFoundError: No module named 'sklearn.cross_validation'
    [Qt] 通过socket将另一个程序的某个窗口调到最前端
    SortedDictionary<TKey, TValue> 类 表示根据键进行排序的键/值对的集合。
    finally不管有没有错都会运行 finally 块用于清除 try 块中分配的任何资源,以及运行任何即使在发生异常时也必须执行的代码
    HttpWebRequest使用证书请求
    string StartsWith 方法 Https
    设置https验证方式
  • 原文地址:https://www.cnblogs.com/javaskill/p/6140096.html
Copyright © 2020-2023  润新知