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

📄 frmserver.frm

📁 关于WINSOCK控件基本编程的例程,提供电子邮件例程
💻 FRM
字号:
VERSION 5.00
Object = "{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.0#0"; "MSCOMCTL.OCX"
Object = "{248DD890-BB45-11CF-9ABC-0080C7E7B78D}#1.0#0"; "MSWINSCK.OCX"
Begin VB.Form Form1 
   Caption         =   "聊天室-服务器"
   ClientHeight    =   6315
   ClientLeft      =   60
   ClientTop       =   345
   ClientWidth     =   5505
   LinkTopic       =   "Form1"
   ScaleHeight     =   6315
   ScaleWidth      =   5505
   StartUpPosition =   3  '窗口缺省
   Begin MSWinsockLib.Winsock SckServer 
      Index           =   0
      Left            =   3720
      Top             =   5880
      _ExtentX        =   741
      _ExtentY        =   741
      _Version        =   393216
   End
   Begin MSWinsockLib.Winsock scklisten 
      Left            =   1680
      Top             =   5880
      _ExtentX        =   741
      _ExtentY        =   741
      _Version        =   393216
      LocalPort       =   2001
   End
   Begin VB.CommandButton Command3 
      Caption         =   "发送信息"
      Height          =   735
      Left            =   3360
      TabIndex        =   3
      Top             =   5040
      Width           =   2055
   End
   Begin VB.CommandButton Command2 
      Caption         =   "踢出聊天室"
      Height          =   615
      Left            =   3360
      TabIndex        =   2
      Top             =   2760
      Width           =   2055
   End
   Begin VB.CommandButton Command1 
      Caption         =   "查看IP"
      Height          =   615
      Left            =   3360
      TabIndex        =   1
      Top             =   360
      Width           =   2055
   End
   Begin MSComctlLib.ListView ListView1 
      Height          =   5535
      Left            =   120
      TabIndex        =   0
      Top             =   240
      Width           =   3135
      _ExtentX        =   5530
      _ExtentY        =   9763
      View            =   2
      LabelWrap       =   -1  'True
      HideSelection   =   -1  'True
      FlatScrollBar   =   -1  'True
      GridLines       =   -1  'True
      _Version        =   393217
      ForeColor       =   -2147483641
      BackColor       =   -2147483628
      BorderStyle     =   1
      Appearance      =   1
      NumItems        =   0
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False


Private Function FindOpenWinsock()
'此函数用来为新用户提供新的控件
    Static LocalPorts As Integer
    For X = 0 To SckServer.UBound
        If SckServer(X).State = 0 Then
            '如果状态为0,即关闭,我们可以使用它
            FindOpenWinsock = X
            '跳出函数,当然也跳出了循环
            Exit Function
        End If
    Next X
    '没有可用的,就装载一个最新的
    Load SckServer(SckServer.UBound + 1)
    '加一保证所用的端口互不相同
    LocalPorts = LocalPorts + 1
    SckServer(SckServer.UBound).LocalPort = SckServer(wsArray.UBound).LocalPort + LocalPorts
    '返回新的序号值,即新装载控件的序号
    FindOpenWinsock = SckServer.UBound
End Function

Private Sub Command1_Click()
On Error GoTo 0
    For i = 0 To ListView1.ListItems.Count - 1
        If ListView1.ListItems(i).Selected = True Then
            '通过用户名获得它所使用WINSOCK控件的Index,然后显示其IP
            MsgBox SckServer(NameInfo(ListView1.ListItems(i))).RemoteHostIP, vbOKOnly, "IP"
        End If
        Exit For
    Next i
End Sub

Private Sub Command2_Click()
    '服务器断开,中断服务
    For i = 0 To ListView1.ListItems.Count - 1
        If ListView1.ListItems(i).Selected = True Then
            SckServer(NameInfo(ListView1.ListItems(i))).Close
            ListView1.ListItems.Remove (NameInfo(ListView1.ListItems(i)))
        End If
        Exit For
    Next i
End Sub

Private Sub Command3_Click()
    Dim SerInfo As String
    For i = 0 To ListView1.ListItems.Count - 1
        If ListView1.ListItems(i).Selected = True Then
            SerInfo = InputBox("请输入消息内容", "serinfo")
            '发送消息到客户端
            '规定"~si~"为服务器消息标志
            SckServer(NameInfo(ListView1.ListItems(i))).SendData "~si~|" & LenInfo(SerInfo) & SerInfo
        End If
        Exit For
    Next i
End Sub

Private Sub Form_Load()
    '开始监听
    scklisten.Listen
End Sub

Private Sub scklisten_ConnectionRequest(ByVal requestID As Long)
    Index = FindOpenWinsock
    '由新装载的控件接受客户的连接请求
    SckServer(Index).Accept requestID
    UserIndex = UserIndex + 1
End Sub

Private Sub SckServer_Close(Index As Integer)
    UserIndex = UserIndex - 1
End Sub

Private Sub SckServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)

Dim Len1, Len2, Len3, Len4 As Integer
Dim GetData, Neir, ToName As String
Neir = ""
SckServer(Index).GetData GetData, vbString
MsgBox GetData
'先判断是否在聊天室内
'规定"~ni~"为不在聊天室标志
If Left$(GetData, 4) = "~ni~" Then
    '判断是否有请求进入聊天室标志
    If Mid$(GetData, 6, 4) = "~ai~" Then
        Len1 = Mid$(GetData, 11, 1)
        Len2 = Val(Mid$(GetData, 12, Len1))
        '通过长度信息得到用户名
        User(Index) = Right$(GetData, Len2)
        '加入到聊天者列表中
        ListView1.ListItems.Add UserIndex, , User(Index)
    End If
'先判断是否在聊天室内
'规定"~in~"为在聊天室内标志
If Left$(GetData, 4) = "~in~" Then
    '判断是否有请求名单标志
    '规定"~aw~"为请求名单标志
    If Mid$(GetData, 6, 4) = "~aw~" Then
        For i = 0 To ListView1.ListItems.Count - 1
            '逐个将名单发送
            SckServer(Index).SendData "~nb~|" & LenInfo(ListView1.ListItems(i)) & ListView1.ListItems(i)
        Next i
    End If
    '判断是否要请求退出
    '规定"~wo~"为请求退出标志
    If Mid$(GetData, 6, 4) = "~wo~" Then
        '发送同意退出标志
        SckServer(Index).SendData "~aq~"
        '相应的服务器关闭
        SckServer(Index).Close
        '清除在服务器中的显示
        ListView1.ListItems.Remove (Index)
    End If
    '判断是否有公开聊天标志
    '规定"~ev~"为公开聊天标志
    If Mid$(GetData, 6, 4) = "~ev~" Then
        Len1 = Mid$(GetData, 11, 1)
        Len2 = Val(Mid$(GetData, 12, Len1))
        Neir = Right$(GetData, Len2)
        For i = 0 To SckServer.UBound
            If SckServer(i).State = 7 Then
                '向参与聊天的每个人发送此消息
                '对于每个WINSOCK控件,必须判断其状态
                SckServer(i).SendData "~ev~|" & LenInfo(Neir) & Neir
            End If
        Next i
    End If
    '判断是否为私聊
    '规定"~on~"为私聊标志
    If Mid$(GetData, 6, 4) = "~on~" Then
        '先获得私聊的对象
        Len1 = Mid$(GetData, 11, 1)
        Len2 = Mid$(GetData, 12, Len1)
        ToName = Mid$(GetData, 11 + Len1, Len2)
        '再获得私聊的内容
        Len3 = Mid$(GetData, 11 + Len1 + Len2, 1)
        Len4 = Mid$(GetData, 11 + lne1 + Len2 + Len3, Len3)
        Neir = Right$(GetData, Len4)
        '向私聊对象发送消息,由相应的WINSOCK发送
        SckServer(NameInfo(ToName)).SendData "~on~|" & LenInfo(ToName) & ToName & LenInfo(nei) & nei
    End If
End If
End If
End Sub

Private Sub SckServer_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
    SckServer(Index).Close
End Sub

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -