好站連結:程式設計工藝大師   

 

..作業7..client&server連線

client端.程式碼

Option Explicit

 

Private Sub Command1_Click()
' 如果目前 Winsock控制項不是處在關閉的狀態
' 先關閉Winsock1控制項。
If Winsock1.State <> sckClosed Then
Winsock1.Close
End If
' 呼叫Connect方法和主機連線
Winsock1.Connect
End Sub

 

Private Sub Command2_Click()
' 關閉Winsock控制項目前的連線
Winsock1.Close
End Sub

 

Private Sub Command3_Click()
If Winsock1.State = sckConnected Then
' 傳送用戶的名稱和希望傳送的訊息
Winsock1.SendData "<" & Text1.Text & "> " & Text4.Text
Text4.Text = ""
Else
MsgBox "尚未連線成功!"
End If
End Sub

 

Private Sub Form_Load()
' 初始化各種控制項的Caption屬性或Text屬性
Command1.Caption = "連線"
Command2.Caption = "離線"
Command3.Caption = "傳送"
Frame1.Caption = "選項"
Label1.Caption = "本機名稱:"
Label2.Caption = "主機 IP 位址:"
Label3.Caption = "連接埠編號:"
Me.Caption = "尚未連線"
Text1.Text = "用戶端"
Text2.Text = "192.168.10.22"  須輸入要連線的那台電腦(server)
Text3.Text = "423"  要輸入與server相同的埠號
Text4.Text = ""
Text5.Text = ""
' 設定 Winsock控制項的各種屬性
Winsock1.Protocol = sckTCPProtocol
Winsock1.RemoteHost = Trim(Text2.Text)
Winsock1.RemotePort = CLng(Text3.Text)
Timer1.Interval = 100
End Sub

 

Private Sub Timer1_Timer()
Select Case Winsock1.State
Case sckConnected
Form1.Caption = "已連線!" & Winsock1.LocalPort
Case sckClosed
Form1.Caption = "已離線!"
End Select
End Sub

 

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim sVar As Variant
' 使用字串資料型態取回緩衝區的資料
Winsock1.GetData sVar, vbString
' 將取回的資料,加入Text5控制項
Text5.Text = Text5.Text & vbCrLf & sVar
End Sub

client端.圖片

PCAPCB  

server端.程式碼

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

server端.圖片

server  

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 妮媽 的頭像
    妮媽

    新手媽媽成長紀錄

    妮媽 發表在 痞客邦 留言(0) 人氣()