1 通信程序通常都是采用Client/Server形式。這就要求作為服務器的主機可以同時處理多個客戶的請求。因此在編寫服務器程序時要添加多個Winsock控件。在開始我們先加入兩個Winsock控件。其中一個用來偵聽網上請求信號,取名為Listener;另外一個為初始的連接口,取名叫Sock(
0)。注意,后一個控件要設為動態數組的形式,以后當客戶增多時,可在這個控件基礎上動態增加。由於受資源限制,我們在本例中設定最多可以同時接納15個客戶。客戶機一般只與一個主機相連,因此程序只須一個Winsock進行連接就足夠了。這個程序要用到的控件較少,除了Winsock和Form控件外,只須再添加Commmand控件即可。下面是具體程序和詳細注釋。
2 ******************************
3 ' 服務器程序
4 ******************************
5 Option Explicit
6 定義常量
7 Const BUSY As Boolean = False
8 Const FREE As Boolean = True
9 定義連接狀態
10 Dim ConnectState() As Boolean
11 Private Sub Form_Load()
12 ReDim Preserve ConnectState( 0 To 1)
13 On Error Resume Next
14 ConnectState( 0) = FREE
15 ConnectState( 1) = FREE
16 ' 指定網絡端口號
17 Listener.LocalPort = 1011
18 ' 開始偵聽
19 Listener.Listen
20 End Sub
21 Private Sub Listener_ConnectionRequest(ByVal requestID As Long)
22 Dim SockIndex As Integer
23 Dim SockNum As Integer
24 On Error Resume Next
25 Form1.Print requestID & " 連接請求 "
26 ' 查找連接的用戶數
27 SockNum = UBound(ConnectState)
28 If SockNum > 14 Then
29 Form1.Print SockIndex & ""
30 Exit Sub
31 End If
32 ' 查找空閑的sock
33 SockIndex = FindFreeSocket()
34 ' 如果已有的sock都忙,而且sock數不超過15個,動態添加sock
35 If SockIndex > SockNum Then
36 Load Sock(SockIndex)
37 End If
38 ConnectState(SockIndex) = BUSY
39 Sock(SockIndex).Tag = SockIndex
40 ' 接受請求
41 Sock(SockIndex).Accept (requestID)
42 Form1.Print SockIndex & " 接受請求 "
43 End Sub
44
45 ' 客戶斷開,關閉相應的sock
46 Private Sub Sock_Close(Index As Integer)
47 If Sock(Index).State <> sckClosed Then
48 Sock(Index).Close
49 End If
50 ConnectState(Index) = FREE
51 Form1.Print Index & " close "
52 End Sub
53
54 ' 接收數據
55 Private Sub Sock_DataArrival(Index As Integer, ByVal bytesTotal As Long)
56 Dim dx As Double
57 Form1.Print " 數據來自 " & Index
58 Sock(Index).GetData dx, vbDouble
59 Form1.Print " dx= " & dx
60 End Sub
61
62 ' 尋找空閑的sock
63 Public Function FindFreeSocket()
64 Dim SockCount, i As Integer
65 SockCount = UBound(ConnectState)
66 For i = 0 To SockCount
67 If ConnectState(i) = FREE Then
68 FindFreeSocket = i
69 Exit Function
70 End Ifs
71 Next i
72 ReDim Preserve ConnectState( 0 To SockCount + 1)
73 FindFreeSocket = UBound(ConnectState)
74 End Function
75
76 ***************************
77 ' 客戶程序
78 ’***************************
79 Option Explicit
80 ' 發送數據
81 Private Sub command1_Click()
82 Dim dx As Double
83 dx = 23.9
84 sock.SendData dx
85 MsgBox ( " data sended ")
86 End Sub
87
88 Private Sub Form_Load()
89 ' 遠程主機名
90 sock.RemoteHost = " media2 "
91 ' 網絡端口
92 sock.RemotePort = 1011
93 ' 發出連接命令
94 sock.Connect
95 Command1.Enabled = False
96 End Sub
97
98 ' 服務器關閉
99 Private Sub sock_Close()
100 MsgBox ( " socket closed ")
101 End Sub
102
103 ' 連接成功
104 Private Sub sock_Connect()
105 MsgBox ( " socket connected ")
106 Command1.Enabled = True
107 End Sub
2 ******************************
3 ' 服務器程序
4 ******************************
5 Option Explicit
6 定義常量
7 Const BUSY As Boolean = False
8 Const FREE As Boolean = True
9 定義連接狀態
10 Dim ConnectState() As Boolean
11 Private Sub Form_Load()
12 ReDim Preserve ConnectState( 0 To 1)
13 On Error Resume Next
14 ConnectState( 0) = FREE
15 ConnectState( 1) = FREE
16 ' 指定網絡端口號
17 Listener.LocalPort = 1011
18 ' 開始偵聽
19 Listener.Listen
20 End Sub
21 Private Sub Listener_ConnectionRequest(ByVal requestID As Long)
22 Dim SockIndex As Integer
23 Dim SockNum As Integer
24 On Error Resume Next
25 Form1.Print requestID & " 連接請求 "
26 ' 查找連接的用戶數
27 SockNum = UBound(ConnectState)
28 If SockNum > 14 Then
29 Form1.Print SockIndex & ""
30 Exit Sub
31 End If
32 ' 查找空閑的sock
33 SockIndex = FindFreeSocket()
34 ' 如果已有的sock都忙,而且sock數不超過15個,動態添加sock
35 If SockIndex > SockNum Then
36 Load Sock(SockIndex)
37 End If
38 ConnectState(SockIndex) = BUSY
39 Sock(SockIndex).Tag = SockIndex
40 ' 接受請求
41 Sock(SockIndex).Accept (requestID)
42 Form1.Print SockIndex & " 接受請求 "
43 End Sub
44
45 ' 客戶斷開,關閉相應的sock
46 Private Sub Sock_Close(Index As Integer)
47 If Sock(Index).State <> sckClosed Then
48 Sock(Index).Close
49 End If
50 ConnectState(Index) = FREE
51 Form1.Print Index & " close "
52 End Sub
53
54 ' 接收數據
55 Private Sub Sock_DataArrival(Index As Integer, ByVal bytesTotal As Long)
56 Dim dx As Double
57 Form1.Print " 數據來自 " & Index
58 Sock(Index).GetData dx, vbDouble
59 Form1.Print " dx= " & dx
60 End Sub
61
62 ' 尋找空閑的sock
63 Public Function FindFreeSocket()
64 Dim SockCount, i As Integer
65 SockCount = UBound(ConnectState)
66 For i = 0 To SockCount
67 If ConnectState(i) = FREE Then
68 FindFreeSocket = i
69 Exit Function
70 End Ifs
71 Next i
72 ReDim Preserve ConnectState( 0 To SockCount + 1)
73 FindFreeSocket = UBound(ConnectState)
74 End Function
75
76 ***************************
77 ' 客戶程序
78 ’***************************
79 Option Explicit
80 ' 發送數據
81 Private Sub command1_Click()
82 Dim dx As Double
83 dx = 23.9
84 sock.SendData dx
85 MsgBox ( " data sended ")
86 End Sub
87
88 Private Sub Form_Load()
89 ' 遠程主機名
90 sock.RemoteHost = " media2 "
91 ' 網絡端口
92 sock.RemotePort = 1011
93 ' 發出連接命令
94 sock.Connect
95 Command1.Enabled = False
96 End Sub
97
98 ' 服務器關閉
99 Private Sub sock_Close()
100 MsgBox ( " socket closed ")
101 End Sub
102
103 ' 連接成功
104 Private Sub sock_Connect()
105 MsgBox ( " socket connected ")
106 Command1.Enabled = True
107 End Sub