VB6 通過winsock控件數組實現客戶端和服務器多對一通信


轉:http://blog.csdn.net/geohuskyer/article/details/6261062 
 

在VB6中使用winsock控件需要引用Microsoft Winsock Control 6.0部件

 

使用winsock控件可以實現客戶端和服務器間C/S結構的通信,如果把客戶端和服務器放置於同一台電腦中,並且將客戶端winsock的RemoteHost設置為本機IP,則可以實現客戶端程序和服務端程序間的自由通信。在應用程序之間采用winsock通信比內存共享等方法更簡單快捷,同時也更安全。

 

在客戶端中添加一個窗體,拖拽一個winsock控件到該窗體上。

[vb]  view plain copy
  1. Private Sub Form_Load()  
  2. Me.Winsock1.RemoteHost = "192.168.1.5"  
  3. Me.Winsock1.RemotePort = 10002  
  4. Me.Winsock1.Connect  
  5. End Sub  

 

RemoteHost代表需要連接的遠程服務器IP地址,局域網中的通信可以使用路由器分配的IP地址。

RemotePort代表端口號,服務器和客戶端通過該端口進行連接。

 

[vb]  view plain copy
  1. Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)  
  2. Dim strGet As String  
  3.   
  4. '接收字符串並寫入Text1控件中  
  5. Winsock1.GetData strGet  
  6. Text1.Text = strGet  
  7. End Sub  

 

當客戶端的winsock接收到服務器發送來的數據后會觸發Winsock1_DataArrival事件,利用GetData方法可以將數據讀取出來,一般來說將數據讀取到byte()數組中是最好的,因為利用字節數組可以收發圖片、音頻等文件,本例中為了演示所以直接用一個字符串變量來讀取數據了。

 

[vb]  view plain copy
  1. Dim strSet As String  
  2. Winsock1.SendData strSet  

 

客戶端向服務器發送數據可以用SendData方法,該方法同樣可以發送字節數組,這里為了演示所以發送了個字符串。

 

 

服務器端為了能同時和很多個不同的客戶端進行通信,所以需要采用winsock控件數組,在服務器窗體中拖拽一個winsock控件,將其名稱更改為Listener,該控件用於接收客戶端的連接請求。再拖拽一個winsock控件到窗體中,然后將其Index屬性更改為0,0即代表該控件是一個控件數組,為了使用方便所以把控件名稱更改為Sock,該控件數組用於動態的和不同的客戶端通信。

 

在服務器端的窗口中寫入如下代碼:

[vb]  view plain copy
  1. Private Sub Form_Load()  
  2. Load Sock(0)  
  3. Listener.LocalPort = 10002   '端口號  
  4. Listener.Listen             '開始偵聽  
  5. End Sub  

 

 

利用Listener來偵聽,代碼如下:

[c-sharp]  view plain copy
  1. Private Sub Listener_ConnectionRequest(ByVal requestID As Long)  
  2. Dim SockIndex As Integer: SockIndex = 8888  
  3.   
  4. Dim i As Integer  
  5.   
  6. '遍歷控件  
  7. For i = 0 To Sock.UBound  
  8.     If Sock(i).State = 0 Then SockIndex = i  
  9. Next  
  10.   
  11. If SockIndex = 8888 Then  
  12.     Load Sock(Sock.UBound + 1)  
  13.     SockIndex = Sock.UBound  
  14. End If  
  15.   
  16. '接受請求  
  17. Sock(SockIndex).Accept (requestID)  
  18. End Sub  

 

 

當有客戶端需要連接服務器時會觸發Listener_ConnectionRequest事件,此時會遍歷Sock控件數組,如果里面有空閑的Sock則用這個空閑的Sock和客戶端進行連接,如果沒有空閑的則重新Load一個進來。這里俺將SockIndex賦了個8888的值,這是因為用於和客戶端連接的Sock控件數組的下標為0,為了省事所以賦了個8888,這個方法不太安全的,所以大家別學我,呵呵

 

當客戶端和服務器端成功連接后就可以利用Sock控件數組來和客戶端相互傳遞數據了,當客戶端將數據發送給服務器端時會觸發Sock_DataArrival事件,代碼如下:

[vb]  view plain copy
  1. Private Sub Sock_DataArrival(Index As Integer, ByVal bytesTotal As Long)  
  2. Dim strGet As String  
  3.   
  4. '接收字符串並寫入text中  
  5. Sock(Index).GetData strGet  
  6. Text2.Text = strGet  
  7. End Sub  

 

Index參數代表正在和客戶端保持連接的Sock控件數組的序號,而bytesTotal代表數據的長度(汗,這樣解釋貌似不怎么對)

,利用GetData方法即可以將數據讀取出來。

 

如果服務器想給客戶端發送數據,則直接用SendData方法即可,如下所示:

[vb]  view plain copy
  1. Dim strSend as String  
  2. Sock(Index).SendData strSend  

 

Index代表的是Sock數組的序號,如果想給所有保持連接的客戶端都發送相同的內容,則可以遍歷一下Sock數組,然后挨個發送就是了,如下所示:

[vb]  view plain copy
  1. For i = 0 To Sock.UBound  
  2.     If Sock(i).State = 7 Then  
  3.        Sock(i).SendData "范例"  
  4.     End If  
  5. Next i  

 

 

如果服務器端想關閉某個連接,則需要關閉對應的Sock(),如下所示:

[vb]  view plain copy
  1. Sock(Index).Close  

 

 

上面的這些代碼演示了如何實現一個簡單的C/S結構服務器和客戶端連接。俺只是個業余編程愛好者,雖然VB很簡單但學習的時候也是着實費了不少力氣,為了能給以后的初學者提供一點參考的范例所以俺寫了這篇短文,並且盡量采用簡單的語言來給大家演示,希望能對初學者有點幫助。


免責聲明!

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



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