zoukankan      html  css  js  c++  java
  • 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、

  • 相关阅读:
    leetcode 350. Intersection of Two Arrays II
    leetcode 278. First Bad Version
    leetcode 34. Find First and Last Position of Element in Sorted Array
    leetcode 54. Spiral Matrix
    leetcode 59. Spiral Matrix II
    leetcode 44. Wildcard Matching
    leetcode 10. Regular Expression Matching(正则表达式匹配)
    leetcode 174. Dungeon Game (地下城游戏)
    leetcode 36. Valid Sudoku
    Angular Elements
  • 原文地址:https://www.cnblogs.com/javaskill/p/6140096.html
Copyright © 2011-2022 走看看