⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clswskcommandprocess.cls

📁 计算机网络与通信的知识
💻 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 + -