客户端模块详解
工程概览
- 工程文件:
src-client/Client.vbp - 启动对象:
fLogin - 输出文件:
dist/客户端/Client.exe - 配置文件:
config.ini
全局模块
Insts.bas
定义客户端全局共享的实例:
vb
Public TcpClient As cWinsock ' TCP 连接对象
Public CurrentUser As New cJson ' 当前登录用户信息缓存ConnectToServer — 根据 config.ini 中的配置连接服务端:
vb
Public Sub ConnectToServer()
With VBMAN.Ini.Section("Server")
TcpClient.Connect .Item("IP"), .Item("Port")
End With
End Sub窗体模块
fLogin.frm — 登录窗体
界面元素:
Text1— 用户名输入框Text2— 密码输入框(显示为*)Command1— 登录按钮Command2— 设置按钮(打开fSetting)Picture2/Label4— 状态栏(显示连接状态)Timer1— 重连定时器(3秒间隔)
核心逻辑:
Form_Load:
- 加载
config.ini,若服务器配置缺失则强制弹出fSetting - 注册路由:
User,Message,Notify - 初始化
TcpClient,尝试连接服务器 - IDE 调试模式下自动填充测试账号
wangli/123456
- 加载
Command1_Click (登录):
vbWith New cJson .Item("username") = Text1.Text .Item("password") = Common.Password(Text2.Text) Common.SendTo Insts.TcpClient, "user/login", .Root End With密码通过
Common.Password使用 VBMAN 的哈希算法加密后发送。Tcp 事件:
Connect— 状态栏变绿,启用登录按钮CloseEvent— 状态栏变红,禁用登录按钮,启动重连定时器DataArrival— 调用Common.HandleReciver处理数据
Form1.frm — 客户端主窗体
界面布局:
List1— 左侧功能列表(由bCalc初始化填充参数键名)Text1— 右侧编辑区(显示/编辑参数值或 JSON)Text2— 底部公告栏(浅蓝色背景,只读)Label1— 右上角状态标签
菜单:
文件 → 设置— 打开fSetting,重新连接服务器文件 → 开机启动— 切换 Windows 开机启动状态文件 → 修改密码— 打开fChangePwd,修改当前用户密码发送参数到服务器— 将当前编辑的 50 个参数发送到服务端
核心逻辑:
Form_Load:
- 检查是否已登录(
CurrentUser是否为空),未登录则返回fLogin - 接管
TcpClient实例 - 注册
Calc路由 - 请求最新公告
Notify/CheckNew - 初始化
bCalc并绑定List1和Text1
- 检查是否已登录(
bCalc 集成:
List1显示 50 个参数名- 点击参数名 →
Text1显示对应值,可直接编辑 - 菜单发送 → 将完整 JSON 发送到服务端
Calc/Submit
fChangePwd.frm — 修改密码窗体
界面元素:
txtOldPwd— 旧密码输入框(密码显示)txtNewPwd— 新密码输入框(密码显示)txtNewPwd2— 确认新密码输入框(密码显示)cmdOK— 确定按钮cmdCancel— 取消按钮lblUser— 显示当前用户信息
核心逻辑:
Form_Load:
- 显示当前登录用户的昵称和账号
cmdOK_Click (修改密码):
- 本地验证:旧密码、新密码、确认密码非空
- 验证两次输入的新密码是否一致
- 验证新密码长度不少于 6 位
- 发送请求到服务端
User/ChangePassword:
vbWith New cJson .Item("oldPassword") = Common.Password(OldPwd) .Item("newPassword") = Common.Password(NewPwd) Common.SendTo Insts.TcpClient, "User/ChangePassword", .Root End WithcmdCancel_Click:
- 关闭窗口
fSetting.frm — 服务器配置窗体
界面元素:
Text1— 服务器 IP 输入框Text2— 端口输入框Command1— 保存按钮Command2— 退出程序按钮Command3— 关闭窗口按钮
核心逻辑:
Form_Load:
- 从
config.ini读取现有配置并填充
- 从
Command1_Click (保存):
vbWith VBMAN.Ini.Section("Server") .Item("IP") = Text1.Text .Item("Port") = Text2.Text End With VBMAN.Ini.SaveTo保存后关闭窗口,调用方(
fLogin)会继续尝试连接。
业务类
bUser.cls — 用户业务
| 方法 | 说明 |
|---|---|
Info(Inst, Data) | 接收服务端返回的用户信息,解析保存到 CurrentUser,延时 2 秒后显示 Form1 |
ShowMainForm() | 被 Delay.Callback 异步调用,避免在 TCP 事件内直接切换窗体引发重入问题 |
ChangePassword(Inst, Data) | 接收服务端返回的密码修改结果,关闭修改密码窗口 |
异步显示主窗体的原因:
因为
bUser.Info在 TCP 接收处理器内部执行,而fLogin也监听了 TCP 事件。如果直接在Info中Unload fLogin,会引发事件重入冲突。因此使用VBMAN.Delay.Callback(Me, "ShowMainForm").CountDown 2000延迟 2 秒后异步执行。
bNotify.cls — 公告业务
| 方法 | 说明 |
|---|---|
Show(Inst, Data) | 接收服务端推送的公告内容,显示在 Form1.Text2 中,同时弹出 Toast 通知 |
公告显示格式:
【公告】标题(发布时间)
公告正文内容...bCalc.cls — 参数计算演示
这是一个完整的客户端-服务端数据交互演示类,包含 50 个多类型参数。
数据类型覆盖:
| 类型 | 字段示例 | VB 类型 |
|---|---|---|
| 长整型 | id, timeout | Long |
| 整型 | age, screenW | Integer |
| 字节型 | grade, retryCount | Byte |
| 货币型 | salary, revenue | Currency |
| 单精度浮点 | height, velocity | Single |
| 双精度浮点 | pressure, lat | Double |
| 布尔型 | isActive, isVip | Boolean |
| 日期型 | birthDate, joinAt | Date |
| 字符串型 | name, email, address | String |
交互流程:
CreateJsonData— 初始化 50 个参数到JsonData对象List1_Click— 选择参数,在Text1中显示值Inputor_Change— 编辑参数值,实时更新JsonDataSendJsonDataToServer— 发送完整 JSON 到服务端Calc/SubmitShow(Inst, Data)— 接收服务端修改后的数据,回显格式化 JSON 到Text1
配置文件 (config.ini)
ini
[Server]
IP=127.0.0.1
Port=800- 首次启动时若配置缺失,会强制弹出
fSetting要求填写 - 配置保存在客户端同目录下