VB6 通過winsock控制項數組實現用戶端和伺服器多對一通訊

來源:互聯網
上載者:User

轉: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 plaincopy

  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 plaincopy

  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 plaincopy

  1. Dim strSet As String  
  2. Winsock1.SendData strSet  

 

用戶端向伺服器發送資料可以用SendData方法,該方法同樣可以發送位元組數組,這裡為了示範所以發送了個字串。

 

 

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

 

在伺服器端的視窗中寫入如下代碼:

[vb] view plaincopy

  1. Private Sub Form_Load()  
  2. Load Sock(0)  
  3. Listener.LocalPort = 10002   '連接埠號碼  
  4. Listener.Listen             '開始偵聽  
  5. End Sub  

 

 

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

[c-sharp] view plaincopy

  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 plaincopy

  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 plaincopy

  1. Dim strSend as String  
  2. Sock(Index).SendData strSend  

 

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

[vb] view plaincopy

  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 plaincopy

  1. Sock(Index).Close  

 

 

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.