VB中利用winsock控件,TCP協議實現多客戶端連接


  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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM