Skip to content

系统架构

整体架构图

┌─────────────────────────────────────────────────────────────────┐
│                         客户端 (Client)                          │
│  ┌──────────┐   ┌──────────┐   ┌──────────┐   ┌──────────────┐  │
│  │ fLogin   │   │ Form1    │   │ fSetting │   │ bCalc/bUser  │  │
│  │ (登录窗) │   │ (主窗体) │   │ (配置窗) │   │ (业务类)     │  │
│  └────┬─────┘   └────┬─────┘   └──────────┘   └──────┬───────┘  │
│       │              │                               │          │
│       └──────────────┴───────────────┬───────────────┘          │
│                                      │                          │
│                         ┌────────────▼────────────┐             │
│                         │    cWinsock (TcpClient) │             │
│                         └────────────┬────────────┘             │
└──────────────────────────────────────┼──────────────────────────┘
                                       │ TCP / JSON
┌──────────────────────────────────────┼──────────────────────────┐
│                         ┌────────────▼────────────┐             │
│                         │    cWinsock (TcpServer) │             │
│                         └────────────┬────────────┘             │
│                                      │                          │
│       ┌──────────────┬───────────────┼───────────────┐          │
│       │              │               │               │          │
│  ┌────┴─────┐   ┌────┴─────┐  ┌─────┴──────┐  ┌────┴─────┐    │
│  │ mAuth    │   │ bUser    │  │ bNotify    │  │ bCalc    │    │
│  │(中间件)  │   │(登录业务)│  │(公告业务)  │  │(参数计算)│    │
│  └──────────┘   └──────────┘  └────────────┘  └──────────┘    │
│                                                               │
│  ┌──────────┐   ┌──────────┐   ┌───────────────────────────┐  │
│  │ Form1    │   │ fNotify  │   │ cDataBase (Access .mdb)   │  │
│  │(主监控窗)│   │(公告编辑)│   │  users 表                 │  │
│  └──────────┘   └──────────┘   └───────────────────────────┘  │
│                        服务端 (Server)                         │
└─────────────────────────────────────────────────────────────────┘

运行流程

1. 服务端启动流程

  1. 启动 Server.exe,加载 Form1
  2. 创建 cWinsock 实例,监听 TCP 800 端口
  3. 连接同目录下的 data.mdb(Access 数据库)
  4. 从数据库加载用户列表到左侧 ListBox
  5. 注册中间件(mAuth)与业务路由(bUser, bNotify, bCalc, cMessage
  6. 等待客户端接入

2. 客户端启动流程

  1. 启动 Client.exe,首先加载 fLogin(登录窗体)
  2. 读取 config.ini 中的服务器 IP 和端口
  3. 若配置不存在,弹出 fSetting 强制用户配置
  4. 注册业务路由(bUser, bNotify, cMessage
  5. 尝试连接服务端
  6. 连接成功后启用登录按钮

3. 用户登录流程

┌─────────┐                          ┌─────────┐
│ Client  │                          │ Server  │
└────┬────┘                          └────┬────┘
     │                                    │
     │ ─────── TCP 连接建立 ─────────────>│
     │                                    │
     │ {action:"User/Login", data:{...}}  │
     │ ──────────────────────────────────>│
     │                                    │
     │                                    │──┐ 查询 Access 数据库
     │                                    │  │ 验证用户名/密码
     │                                    │<-┘
     │                                    │ 生成 Token
     │                                    │ 绑定用户到连接实例
     │                                    │
     │ {action:"User/Info", token:"xxx"}  │
     │ <──────────────────────────────────│
     │                                    │
     │ 显示主窗体 Form1                   │
     │ 请求公告 Notify/CheckNew           │
     │ ──────────────────────────────────>│
     │                                    │

4. 中间件校验流程

所有非白名单请求在执行业务逻辑前,都会经过中间件链:

  1. 收到客户端数据 → Common.HandleReciver
  2. 解析 JSON,提取 actiontoken
  3. 判断是否在白名单(如 User/Login)→ 跳过中间件
  4. 遍历所有中间件,执行 Entry 方法
  5. 任一中间件返回 False → 中断流程,向客户端发送错误提示
  6. 全部通过 → CallByName 调用对应的业务类方法

模块关系

层级客户端服务端说明
UI 层fLogin, Form1, fSettingForm1, fNotify窗体界面与事件响应
业务层bUser, bNotify, bCalcbUser, bNotify, bCalc处理具体业务逻辑
中间件层mAuth权限校验、前置拦截
通信层cWinsockcWinsockTCP 连接、数据收发
数据层CurrentUser (cJson)cDataBase (Access)数据持久化与缓存
公共层Common.bas, cMessage.clsCommon.bas, cMessage.cls路由、发送、消息处理

关键设计模式

路由分发模式

采用字符串分割 + CallByName 实现轻量级路由:

vb
' action = "User/Login" → 拆分为类名 "User" 和方法名 "Login"
Dim Action As Variant: Action = Split(.Root("action"), "/")
CallByName Router.Item(Action(0)), Action(1), VbMethod, Client, Data
  • Router 是一个 cCollection,以类名为 Key 存储业务类实例
  • 新增业务只需:新建类 → 实现 Public Sub Xxx(Inst, Data) → 注册到 Router

全局实例共享

通过标准模块中的 Public 变量实现跨模块共享:

客户端 (Insts.bas):

vb
Public TcpClient As cWinsock      ' TCP 连接实例
Public CurrentUser As New cJson   ' 当前登录用户信息

服务端 (Insts.bas):

vb
Public TcpServer As cWinsock      ' TCP 监听实例
Public Db As cDataBase            ' 数据库连接实例

事件驱动通信

客户端与服务端的窗体均通过 WithEvents 监听 cWinsock 事件:

vb
Dim WithEvents Tcp As cWinsock

Private Sub Tcp_Connect(Client As cWinsock)
    ' 连接成功
End Sub

Private Sub Tcp_DataArrival(Client As cWinsock, ByVal bytesTotal As Long)
    Common.HandleReciver Client, bytesTotal
End Sub

Private Sub Tcp_CloseEvent(Client As cWinsock)
    ' 连接断开
End Sub

VB6及其LOGO版权为微软公司所有