轉:http://blog.csdn.net/geohuskyer/article/details/6261062
在VB6中使用winsock控件需要引用Microsoft Winsock Control 6.0部件
使用winsock控件可以實現客戶端和服務器間C/S結構的通信,如果把客戶端和服務器放置於同一台電腦中,並且將客戶端winsock的RemoteHost設置為本機IP,則可以實現客戶端程序和服務端程序間的自由通信。在應用程序之間采用winsock通信比內存共享等方法更簡單快捷,同時也更安全。
在客戶端中添加一個窗體,拖拽一個winsock控件到該窗體上。
- Private Sub Form_Load()
- Me.Winsock1.RemoteHost = "192.168.1.5"
- Me.Winsock1.RemotePort = 10002
- Me.Winsock1.Connect
- End Sub
RemoteHost代表需要連接的遠程服務器IP地址,局域網中的通信可以使用路由器分配的IP地址。
RemotePort代表端口號,服務器和客戶端通過該端口進行連接。
- 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()數組中是最好的,因為利用字節數組可以收發圖片、音頻等文件,本例中為了演示所以直接用一個字符串變量來讀取數據了。
- Dim strSet As String
- Winsock1.SendData strSet
客戶端向服務器發送數據可以用SendData方法,該方法同樣可以發送字節數組,這里為了演示所以發送了個字符串。
服務器端為了能同時和很多個不同的客戶端進行通信,所以需要采用winsock控件數組,在服務器窗體中拖拽一個winsock控件,將其名稱更改為Listener,該控件用於接收客戶端的連接請求。再拖拽一個winsock控件到窗體中,然后將其Index屬性更改為0,0即代表該控件是一個控件數組,為了使用方便所以把控件名稱更改為Sock,該控件數組用於動態的和不同的客戶端通信。
在服務器端的窗口中寫入如下代碼:
- Private Sub Form_Load()
- Load Sock(0)
- Listener.LocalPort = 10002 '端口號
- Listener.Listen '開始偵聽
- End Sub
利用Listener來偵聽,代碼如下:
- 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事件,代碼如下:
- 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方法即可,如下所示:
- Dim strSend as String
- Sock(Index).SendData strSend
Index代表的是Sock數組的序號,如果想給所有保持連接的客戶端都發送相同的內容,則可以遍歷一下Sock數組,然后挨個發送就是了,如下所示:
- For i = 0 To Sock.UBound
- If Sock(i).State = 7 Then
- Sock(i).SendData "范例"
- End If
- Next i
如果服務器端想關閉某個連接,則需要關閉對應的Sock(),如下所示:
- Sock(Index).Close
上面的這些代碼演示了如何實現一個簡單的C/S結構服務器和客戶端連接。俺只是個業余編程愛好者,雖然VB很簡單但學習的時候也是着實費了不少力氣,為了能給以后的初學者提供一點參考的范例所以俺寫了這篇短文,並且盡量采用簡單的語言來給大家演示,希望能對初學者有點幫助。