轉: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
- Private Sub Form_Load()
- Me.Winsock1.RemoteHost = "192.168.1.5"
- Me.Winsock1.RemotePort = 10002
- Me.Winsock1.Connect
- End Sub
RemoteHost代表需要串連的遠程伺服器IP地址,區域網路中的通訊可以使用路由器分配的IP地址。
RemotePort代表連接埠號碼,伺服器和用戶端通過該連接埠進行串連。
[vb] view plaincopy
- Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
- Dim strGet As String
-
- '接收字串並寫入Text1控制項中
- Winsock1.GetData strGet
- Text1.Text = strGet
- End Sub
當用戶端的winsock接收到伺服器發送來的資料後會觸發Winsock1_DataArrival事件,利用GetData方法可以將資料讀取出來,一般來說將資料讀取到byte()數組中是最好的,因為利用位元組數組可以收發圖片、音頻等檔案,本例中為了示範所以直接用一個字串變數來讀取資料了。
[vb] view plaincopy
- Dim strSet As String
- Winsock1.SendData strSet
用戶端向伺服器發送資料可以用SendData方法,該方法同樣可以發送位元組數組,這裡為了示範所以發送了個字串。
伺服器端為了能同時和很多個不同的用戶端進行通訊,所以需要採用winsock控制項數組,在伺服器表單中拖拽一個winsock控制項,將其名稱更改為Listener,該控制項用於接收用戶端的串連請求。再拖拽一個winsock控制項到表單中,然後將其Index屬性更改為0,0即代表該控制項是一個控制項數組,為了使用方便所以把控制項名稱更改為Sock,該控制項數組用於動態和不同的用戶端通訊。
在伺服器端的視窗中寫入如下代碼:
[vb] view plaincopy
- Private Sub Form_Load()
- Load Sock(0)
- Listener.LocalPort = 10002 '連接埠號碼
- Listener.Listen '開始偵聽
- End Sub
利用Listener來偵聽,代碼如下:
[c-sharp] view plaincopy
- Private Sub Listener_ConnectionRequest(ByVal requestID As Long)
- Dim SockIndex As Integer: SockIndex = 8888
-
- Dim i As Integer
-
- '遍曆控制項
- For i = 0 To Sock.UBound
- If Sock(i).State = 0 Then SockIndex = i
- Next
-
- If SockIndex = 8888 Then
- Load Sock(Sock.UBound + 1)
- SockIndex = Sock.UBound
- End If
-
- '接受請求
- Sock(SockIndex).Accept (requestID)
- End Sub
當有用戶端需要串連伺服器時會觸發Listener_ConnectionRequest事件,此時會遍曆Sock控制項數組,如果裡面有閒置Sock則用這個閒置Sock和用戶端進行串連,如果沒有閒置則重新Load一個進來。這裡俺將SockIndex賦了個8888的值,這是因為用於和用戶端串連的Sock控制項數組的下標為0,為了省事所以賦了個8888,這個方法不太安全的,所以大家別學我,呵呵
當用戶端和伺服器端成功串連後就可以利用Sock控制項數組來和用戶端相互傳遞資料了,當用戶端將資料發送給伺服器端時會觸發Sock_DataArrival事件,代碼如下:
[vb] view plaincopy
- Private Sub Sock_DataArrival(Index As Integer, ByVal bytesTotal As Long)
- Dim strGet As String
-
- '接收字串並寫入text中
- Sock(Index).GetData strGet
- Text2.Text = strGet
- End Sub
Index參數代表正在和用戶端保持串連的Sock控制項數組的序號,而bytesTotal代表資料的長度(汗,這樣解釋貌似不怎麼對)
,利用GetData方法即可以將資料讀取出來。
如果伺服器想給用戶端發送資料,則直接用SendData方法即可,如下所示:
[vb] view plaincopy
- Dim strSend as String
- Sock(Index).SendData strSend
Index代表的是Sock數組的序號,如果想給所有保持串連的用戶端都發送相同的內容,則可以遍曆一下Sock數組,然後挨個發送就是了,如下所示:
[vb] view plaincopy
- For i = 0 To Sock.UBound
- If Sock(i).State = 7 Then
- Sock(i).SendData "範例"
- End If
- Next i
如果伺服器端想關閉某個串連,則需要關閉對應的Sock(),如下所示:
[vb] view plaincopy
- Sock(Index).Close
上面的這些代碼示範了如何?一個簡單的C/S結構伺服器和用戶端串連。俺只是個業餘編程愛好者,雖然VB很簡單但學習的時候也是著實費了不少力氣,為了能給以後的初學者提供一點參考的範例所以俺寫了這篇短文,並且盡量採用簡單的語言來給大家示範,希望能對初學者有點協助。