You are on page 1of 4

MultiLink 的 WinSock Server 程式

我們要先有一個觀念,在 VB 中,

1.一個 WinSock 控制項(當 Server)只能連結一個 Client 端的需求,所以 Server 要變成可多重


連結,要有多個 WinSock 控制項,我們也可以使用 Load 指令來動態產生
2.Server 端必須設定好一個 Local Port 當作其 Listen 的 Port,所有 Client 端的 RemotePort 要
指定 Server 當 Listen 的 Port Number,以本例來說,我設定 3128 當作 Server Listen 的
Port,而我的程式中有一個 WinSock Control (Winsock1(0))專門做 Listen 的動作。在本
例中,我只允許有 4 個 Cllient 同時連上來,所以我在 Form Load 時,便動態產生 4 個
WinSock ,含 Listen 的那一個一共 5 個 WinSock Control。
3.在 Server 端,如果 ConnectionRequest Event 產生了,代表有 Client 端提出需求,這時
候,我們要選取一個沒有使用的 WinSock Control 來和 Client 連。
4.我們在 Client 中,設定 LocalPort = 0 代表會選取一個空著的 Port 來和 Server 的 Port 來連
在 Server 中 Winsock1(i).Accept requestID 便會自動為我們做這件事;這時,我們會看
到 Server 端的會 Assign 一個 RemotePort,而 Client 也會 Assign 一個 LocalPort,這次的連
線便是透過這組連線管道來做

該程式請將 Client 的程式做成.Exe 再來重覆行,且 Server 的程式同時也要執行,當 Client


端的 Text1.Text = "Close" 來送給 Server 時,告知 Server 該 Connection 可結束
其他相關的知識請查 Help 或其他書

註: GetData 方法 的第一個參數 :如果傳回的資料是 String 則宣告成 String,若告成 Variant


在 VB 環境下沒問題,但變成.exe 後會有錯(Automation Error);當然,若傳的是 Binary
的資料,那就使用 ByteArray 來做
'以下是 Server 端程式,需一個 ListBox,一個 WinSock 控制項

Option Explicit

Private Sub Form_Load()


Load Winsock1(1)
Load Winsock1(2)
Load Winsock1(3)
Load Winsock1(4)

Winsock1(0).LocalPort = 3128 '設定 Listen 的 Port 是 3128,請自行改成您的電腦沒衝突的號碼


Winsock1(0).Listen
End Sub

1
Private Sub Form_Unload(Cancel As Integer)
Dim i As Long
For i = 0 To 4
Winsock1(i).Close
Next
Unload Winsock1(1)
Unload Winsock1(2)
Unload Winsock1(3)
Unload Winsock1(4)
End Sub

Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)


Dim i As Long
For i = 1 To 4
If Winsock1(i).State = sckClosed Then
Winsock1(i).Accept requestID
List1.AddItem "Local Port=" + Str(Winsock1(i).LocalPort) + " RemotePort = " +
Str(Winsock1(i).RemotePort)
Exit For
End If
Next
End Sub

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


'Dim mydata As Variant
Dim mydata As String '註:如果傳回的資料是 String 則宣告成 String,若告成 Variant
'在 VB 環境下沒問題,但變成.exe 後會有錯(Automation Error)
Winsock1(Index).GetData mydata, vbString
List1.AddItem "From Socket" + Str(Index) + " " + mydata
Winsock1(Index).SendData "WinSock" + Str(Index) + "Reply"
If mydata = "Close" Then
Winsock1(Index).Close
End If
End Sub

2
'以下是 Client 端程式,需一個 ListBox,一個 WinSock 控制項,三個 Command Button

'與一個 TextBox 用來傳資料,


Option Explicit

Private Sub Command1_Click()


Winsock1.LocalPort = 0 '以便自動產生 Local Port
Winsock1.Connect "140.116.253.247" '設定改成您 Server 電腦的 IP 號碼
End Sub

Private Sub Command2_Click()


Winsock1.SendData "Close" '通知 Server 端 Close
DoEvents
Winsock1.Close
End Sub

Private Sub Command3_Click()


Winsock1.SendData Text1.Text
End Sub

Private Sub Form_Load()


Winsock1.RemotePort = 3128 '設定與 Server 端做 Listen 的 Port 相同
Command1.Caption = "Connect"
Command2.Caption = "Close"
Command3.Caption = "Send"
List1.Clear
End Sub

Private Sub Form_Unload(Cancel As Integer)


If Winsock1.State <> sckClosed Then
Winsock1.SendData "Close"
DoEvents
Winsock1.Close
Winsock1.LocalPort = 0
End Sub

3
Private Sub Winsock1_Connect()
If Winsock1.State = sckConnected Then
List1.AddItem "Connected! LocalPort =" + Str(Winsock1.LocalPort) + " RemptePort = " +
Str(Winsock1.RemotePort)
End If

End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)


Dim mydata As String
Winsock1.GetData mydata, vbString
List1.AddItem mydata
End Sub

Private Sub Winsock1_Error(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)
List1.AddItem Description
End Sub

You might also like