Option Explicit
' 宣告用戶端最大的連線數量
Dim Clients As Integer
Private Sub Form_Load()
Dim I As Integer
Label1.Caption = "連線資訊"
Me.Caption = "多人聊天室主機端"
' 設定用戶端最大數量
Clients = 3 '要更改成要加入連線的人數
' 設定Winsock控制項的協定
Winsock1(0).Protocol = sckTCPProtocol
' 設定Winsock控制項使用的連接埠編號
Winsock1(0).LocalPort = 423 '連接埠號要相同
' Winsock控制項陣列第一個元素 - 監聽用
Winsock1(0).Listen
' 載入多個 Winsock 控制項陣列元素
For I = 1 To Clients
Load Winsock1(I)
Next
Text1.Text = ""
End Sub
Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
Dim I As Integer
Dim Temps As Boolean
Temps = 0
' 判斷各個 Winsock控制項陣列元素的狀態
For I = 1 To Clients
' 判斷如果沒有連線時,才允許連線
If Winsock1(I).State = sckClosed Then
' 暫存變數,用來判斷是否允許連接
Winsock1(I).Accept requestID
' 將遠端電腦加入連線清單中
List1.AddItem I & " " & Winsock1(I).RemoteHostIP & " " & Winsock1(I).RemotePort
' 回傳"主機允許連線"訊息
Winsock1(I).SendData "主機允許連線"
Temps = True
Exit For
End If
Next
' 如果不允許連線時,執行下列If...End If 條件判斷程序
If Temps = False Then
' 如果Winsock1(0)控制項陣列元素的狀態不是 sckClosed 時,
' 先關閉 Winsock1(0)控制項陣列元素目前的狀態
If Winsock1(0).State <> sckClosed Then
Winsock1(0).Close
End If
' 暫時允許目前的連線
Winsock1(0).Accept requestID
' 回傳"不允許連線"訊息
Winsock1(0).SendData "不允許連線"
DoEvents
' 關閉 Winsock1(0)控制項陣列元素
Winsock1(0).Close
DoEvents
' 將Winsock1(0)重新處於監聽的狀態
Winsock1(0).Listen
End If
End Sub
Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long)
On Error Resume Next
Dim I As Integer
Dim sVar As Variant
' 使用字串資料型態取回緩衝區的資料
Winsock1(Index).GetData sVar, vbString
' 更新主機端本身的訊息監視控制項
Text1.Text = Text1.Text & sVar & vbCrLf
' 依照每一個Winsock控制項陣列元素的狀態,
' 判斷是否使用分時傳送的方式,將用戶端的訊息,
' 回傳至每一個已經連線的Winsock用戶端
For I = 1 To Clients
If Winsock1(I).State = sckConnected Then
' 回傳用戶端發出的訊息
Winsock1(I).SendData sVar
DoEvents
End If
Next
End Sub
Private Sub Winsock1_Close(Index As Integer)
' 判斷是否為Winsock1(0)元素發生的Close事件。
' 如果不是,則執行下列 If...End If處理程序
If Index <> 0 Then
Dim I As Integer
Dim Datas
' 清除連線清單的用戶端資料
For I = 1 To List1.ListCount
List1.ListIndex = I - 1
Datas = Split(List1.Text, " ")
If Val(Datas(0)) = Index Then
List1.RemoveItem List1.ListIndex
List1.Refresh
End If
Next
' 如果只是單純關閉連線時,Winsock控制項陣列
' 元素仍會處在連線的狀態。
' 下列程式碼會先卸載特定的控制項陣列元素,再重新載入
Unload Winsock1(Index)
Load Winsock1(Index)
End If
End Sub
|
留言列表