📄 clswskcommandprocess.cls
字号:
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "clsWskCommandProcess"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
'================================================================================
'|| ||
'|| 指令处理类模块 (在服务器端用) ||
'|| 该类模块内容不独立,需要modUsers,modWordProcess模块的支持,但框架 ||
'|| 结构独立。 ||
'|| ||
'|| 核心函数为 CommandProcess,首先分析命令操作码,然后分类执行命令, ||
'|| 若操作数据库,则命令操作数为完整的 SQL 语言,直接传给数据库对象执行。 ||
'|| 执行完毕,若有返回值,通过strCommandResult变量改变GetCommandResult属 ||
'|| 性,数据库查询返回的记录通过约定全部压缩成字符串返回。最后触发 ||
'||CommandProcessFinish事件。 ||
'|| ||
'================================================================================
Option Explicit
Private strCommandResult As String '命令处理结果变量
Private obtDbAccess As clsAccessDB '数据库访存对象
Dim strClientCommandDiv As String '客户端送来的指令分隔符
Dim strCommandResultDiv As String '服务器返回给客户端的指令分隔符
'#########################################################
' 类的一个事件:
' 命令处理完毕触发
' 入口参数:
' intSendToWskIdx 要将命令处理结果返回的Wsk索引号
'#########################################################
Public Event CommandProcessFinish(ByVal intSendToWskIdx As Integer)
'######################################################################
' 类的一个方法:
' 功能描述:
' 根据命令操作码执行命令,执行完毕触发CommandProcessFinish事件,
' 并将执行结果存入strCommandResult变量。
'
'------------------------------------------------
' 客户端送来的所有命令字符串均为以下格式:
' [待操作的数据库标号] [命令分隔符] [命令操作码] [命令分隔符] [命令操作数][命令分隔符][命令结果要送给的用户号]
'
'例如:在本系统中,(指令分隔符strClientCommandDiv 设置为 %),各种客户端指令分别如下:
'(1)客户端用户登录
' 1%LOGIN%密码%登录用户号
'(2)客户端用户注册
' 1%REGISTER%用户的纤细信息列表%0
'(3)客户端用户退出
' 1%EXIT%0%0
'(4)客户端用户发送字符串信息
' 1%SEND%字符串内容%接受该字符串的用户号
'(5)客户端在线用户查询
' 1%ONLINE%0%0
'(6)客户端用户更改密码
' 1%UPDATE%SQL语句%0
'
'------------------------------------------------
' 服务器给客户端返回的结果字符串均为以下格式:
' [结果标志][返回结果主字符串][返回结果分隔符][返回结果字符串1]...
'
' 入口参数:
' intRecvWskIdx 服务器方接收某个客户端命令的wskServer序号
' strClientCommand 客户端送来的指令字符串
'######################################################################
Public Sub CommandProcess(ByVal intRecvWskIdx As Integer, _
ByVal strClientCommand As String)
Dim intSendToWskIdx As Integer '要将命令处理结果返回的Wsk索引号
Dim intDBNameNum As Integer '要操作的数据库序号
Dim strCommandOptCode As String '命令操作码
Dim strCommandData As String '命令操作数(SQL语句)
Dim lngAccount As Long '要将命令执行结果返回给的用户号
Dim strTp As String
Dim intTp As Integer, intTpp As Integer
Dim blnOnline As Boolean
Dim lngTp As Long
Dim wdnTp As WordNode
strCommandResult = ""
lngTp = 1
For intTp = 1 To 4 '解析客户端送来的命令
wdnTp = GetInString(strClientCommand, lngTp, strClientCommandDiv)
Select Case intTp
Case 1
intDBNameNum = Val(wdnTp.strGet) '待操作的数据库标号
Case 2
strCommandOptCode = wdnTp.strGet '命令操作码
Case 3
strCommandData = wdnTp.strGet '命令操作数
Case 4
lngAccount = Val(wdnTp.strGet) '命令结果要送给的用户号
End Select
lngTp = wdnTp.lngNextStart
Next intTp
'分类执行命令
Select Case strCommandOptCode
Case ClientLogin '用户登录,strCommandData中存放密码
arrayLinkUser(intRecvWskIdx).lngAccount = lngAccount
intSendToWskIdx = intRecvWskIdx
intTp = intSendToWskIdx
blnOnline = False
For intTpp = 1 To UBound(arrayLinkUser)
If arrayLinkUser(intTpp).lngAccount = arrayLinkUser(intTp).lngAccount _
And arrayLinkUser(intTpp).blnOnline Then
blnOnline = True
Exit For
End If
Next intTpp
If blnOnline Then
strCommandResult = UserOnline '登录用户已在线
Else
strCommandResult = obtDbAccess.ExeDataBaseAccess(intDBNameNum, _
"SEARCH", _
"SELECT * FROM user WHERE account='" _
+ CStr(arrayLinkUser(intTp).lngAccount) + "'")
If strCommandResult = "NO" Then
strCommandResult = UserNoExist '登录用户不存在
Else
strCommandResult = obtDbAccess.ExeDataBaseAccess(intDBNameNum, _
"SEARCH", _
"SELECT * FROM user WHERE account='" _
+ CStr(arrayLinkUser(intTp).lngAccount) + "' AND pwd='" _
+ strCommandData + "'")
If strCommandResult = "NO" Then
strCommandResult = UserPwdErr '登录用户密码错误
Else
strCommandResult = UserLogin '成功登录
End If
End If
End If
Case ClientRegister '用户注册
lngAccount = obtDbAccess.GetNewAccount
arrayLinkUser(intRecvWskIdx).lngAccount = lngAccount
strCommandData = strCommandData + ",'" + CStr(lngAccount) + "'"
intSendToWskIdx = intRecvWskIdx
strTp = "INSERT INTO user (name,pwd,sex,fancy,account) VALUES (" + strCommandData + ");"
strCommandResult = obtDbAccess.ExeDataBaseAccess(intDBNameNum, _
"ADDNEW", _
strTp)
If strCommandResult = "NO" Then
strCommandResult = UserNoRegister
Else
strCommandResult = UserRegister
End If
Case ClientExit '在线用户退出
intSendToWskIdx = intRecvWskIdx
strCommandResult = UserExit
Case ClientSend '转发字符串
intSendToWskIdx = GetWskIdxBaseUserAccount(lngAccount)
If intSendToWskIdx = 0 Then '接收方用户不在线
intSendToWskIdx = intRecvWskIdx
strCommandResult = UserNotOnline '返回接收方用户不在线指令
Else
strCommandResult = UserSendString + strCommandData + strCommandResultDiv + _
CStr(arrayLinkUser(intRecvWskIdx).lngAccount) + strCommandResultDiv + _
arrayLinkUser(intRecvWskIdx).strName '返回正常指令
End If
Case ClientOnlineUser '在线用户查看
intSendToWskIdx = intRecvWskIdx
intTpp = UBound(arrayLinkUser)
strTp = ""
For intTp = 0 To intTpp
With arrayLinkUser(intTp)
If .blnOnline Then strTp = strTp + "OR account= '" + CStr(.lngAccount) + "' "
End With
Next intTp
strTp = "SELECT name,account,sex,fancy FROM user WHERE " + Mid(strTp, 3)
strCommandResult = UserOnlineRst + obtDbAccess.ExeDataBaseAccess(intDBNameNum, _
"BROWSE", strTp)
Case ClientUpdatePwd '用户更改密码
intSendToWskIdx = intRecvWskIdx
strCommandResult = obtDbAccess.ExeDataBaseAccess(intDBNameNum, _
"UPDATE", _
strCommandData)
If strCommandResult = "NO" Then
strCommandResult = UserNoUpdatePwd
Else
strCommandResult = UserUpdatePwd
End If
End Select
RaiseEvent CommandProcessFinish(intSendToWskIdx) '触发命令处理完事件
End Sub
'#########################################
' 类的一个只读属性
' 返回命令处理结果,没有结果返回""
'#########################################
Property Get GetCommandResult() As String
If strCommandResult <> "" Then
GetCommandResult = strCommandResult
Else
GetCommandResult = ""
End If
End Property
'===================================
' 类的初始化事件
'===================================
Private Sub Class_Initialize()
Set obtDbAccess = New clsAccessDB
'设置数据库转换为字符串的分隔符
obtDbAccess.SetFdDivRstCode strFdRd, strFdDivRst
End Sub
'===================================
' 类的终止事件
'===================================
Private Sub Class_Terminate()
Set obtDbAccess = Nothing
End Sub
'#####################################################
' 类的一个方法
' 设置客户端命令分隔符和服务器返回命令结果分隔符
' 该方法一定要在引用该类后最先调用
'#####################################################
Public Sub SetCommandDiv(ByVal strClientCmdDiv As String, _
ByVal strServerCmdDiv As String)
strClientCommandDiv = strClientCmdDiv
strCommandResultDiv = strServerCmdDiv
End Sub
'#####################################################
' 类的一个方法(ICQ专用,为了frmICQServer窗体模块不接触数据库对象)
' 根据用户号得到呢称
'#####################################################
Public Function GetName(ByVal lngAccount As Long) As String
GetName = obtDbAccess.GetName(lngAccount)
End Function
'#####################################################
' 类的一个方法(ICQ专用,为了frmICQServer窗体模块不接触数据库对象)
' 得到注册用户查询字符串
'#####################################################
Public Function GetAllUsers() As String
GetAllUsers = obtDbAccess.ExeDataBaseAccess(1, "BROWSE", "SELECT account,name,sex,fancy FROM user")
End Function
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -