Winsock控件的作用簡單說就是可以用于兩臺或多臺機器間通信,這里不多說這個控件的作用了,因為在以后的介紹中我們會了解到這個控件的強大功能的,如可以用來做聊天軟件等……
廢話不多說,來看看他有些什么重要的屬性、方法和事件吧!
在VB6.0中的工具箱里默認情況下是沒有這個控件的,添加方法如下:在工具箱上右擊,選擇[部件],然后在部件對話框中選擇"MicrosoftWinsock Control6.0",后確定即可。如果沒有這個復選框的話,請點擊[瀏覽]按鈕后在打開的[添加ActiveX控件]對話框選擇MSWINSCK.ocx后選擇打開,再點確定即可。Winsock控件在工具箱中圖標為
。 屬性名 | 說明 |
BytesReceived | 返回接收的數(shù)據(jù),可以用GetData方法來獲取它 |
LocalHostName | 返回本機名 |
LocalIP | 返回本機IP |
LocalPort | 返回或設置本機所用的端口,如果為0則為隨機產(chǎn)生 |
Protocol | 返回通信所用的協(xié)議 |
RemoteHostName | 返回通信對方的計算機名 |
RemoteHostIP | 返回通信對方的IP |
State | 返回Winscok的當前狀態(tài),取值如下
|
方法名 | 作用 |
listen | 使服務器程序處于偵聽狀態(tài),等待客戶端的連接請求 |
connect | 用于客戶端向遠程發(fā)送一個連接請求,語法:Winsock.connect [IP,Port] |
Accept | 用于服務器接收一個遠程客戶端的連接請求,語法:Winsock.Accept requestID |
sendData | 用于向遠程發(fā)送數(shù)據(jù),語法:Winsock.sendData 數(shù)據(jù) |
getData | 用于接收遠程發(fā)送來的數(shù)據(jù),語法:Winsock.getData 變量 |
Close | 關(guān)閉通信 |
事件名 | 說明 |
Connect | 當服務器接收客戶端請求時,服務端發(fā)生的事件 |
DataArrival | 有數(shù)據(jù)到達時發(fā)生的事件,可以在這個事件中來getData發(fā)送來的數(shù)據(jù) |
ConnectionRequest | 客戶端用Connect方法時服務器發(fā)生的事件,可以在這個事件中來Accept一個連接請求 |
SendProgress | 發(fā)送數(shù)據(jù)中發(fā)生的事件,可以在這個事件中來標示當前已經(jīng)發(fā)送多少數(shù)據(jù) |
SendComplete | 發(fā)送數(shù)據(jù)完成發(fā)生的事件 |
Error | 通信發(fā)生錯誤時發(fā)生的事件 |
Close | 關(guān)閉通信時發(fā)生的事件 |
這節(jié)我們詳細介紹了Winsock控件的屬性、方法和事件等,只要擁有這些,我們就可以編很多功能強大的軟件了。在接下來的幾課中我們將以實例來說明Winsock的應用。
上一節(jié)我們介紹了Winsock控件,這節(jié)我們將以一個聊天器的實例來說說如何應運Winsock控件進行計算機之間的通信。
我也做了一個聊天器,程序點擊這里下載。
這節(jié)課我們做了用于通信的服務端和客戶端,在制作他們之前,先看看服務端和客戶端是如何設計的:(注:要復制本頁代碼時要注意去掉不正確的字符如?號)
1、設置好localPort作為偵聽端口
2、使用listen使服務端處在偵聽狀態(tài)
3、客戶端發(fā)出連接請求后觸發(fā)ConnectionRequest事件
4、在ConnectionRequest中用Accept方法來接收客戶端的連接請求
5、收發(fā)數(shù)據(jù)
1、設置RemoteHost,即你要連接IP
2、設置好RemotePort,即通信的端口號,要與服務端的一致
3、使用Connect方法向服務端發(fā)出連接請求
4、如果服務端同意連接請求則觸發(fā)Connect事件
5、收發(fā)數(shù)據(jù)
界面如下:
|
服務器設計第一、二步的實現(xiàn)(窗體的Load事件):
Private Sub Form_Load()
wskServer.LocalPort = 1024 ' 1、設置好localPort作為偵聽端口
wskServer.Listen ' 2、使用listen使服務端處在偵聽狀態(tài)
End Sub
服務器設計第三、四步的實現(xiàn)(Winsock的Connect):
Private Sub wskServer_ConnectionRequest(ByVal requestID As Long)
If wskServer.State <> sckClosed Then
wskServer.Close '這里要先關(guān)閉,要不會報錯
wskServer.Accept requestID ' 4、在ConnectionRequest中用Accept方法來接收客戶端的連接請求
End If
End Sub
服務器設計第五步的實現(xiàn):
Private Sub cmdSend_Click()
wskServer.SendData txtMessage.Text '發(fā)送數(shù)據(jù)
txtContent.Text = vbCrLf & txtContent.Text & "我說:" & txtMessage.Text '加到聊天記錄中
txtContent.Text=""
End SubPrivate Sub wskServer_DataArrival(ByVal bytesTotal As Long)
Dim tempS As String
wskServer.GetData tempS '接收數(shù)據(jù)
txtContent.Text = txtContent.Text & "對方說:" & tempS & vbCrLf '加到聊天記錄中
End Sub
將上面的程序生成一個EXE文件(名為:Server.exe),然后新建一個工程以制作客戶端。
界面如下:
|
客戶端設計第一、二、三步的實現(xiàn):
Private Sub cmdConnect_Click()
Dim IP As String
IP = InputBox("請輸入要連接的IP", "輸入的IP", "127.0.0.1") '連接的IP默認為本機
wskClient.RemoteHost = IP '1、設置RemoteHost,即你要連接IP
wskClient.RemotePort = 1024 '2、設置好RemotePort,即通信的端口號,要與服務端的一致
wskClient.Connect '3、使用Connect方法向服務端發(fā)出連接請求
cmdConnect.Enabled = False
End Sub
客戶端設計第五步的實現(xiàn)(發(fā)送和接收代碼和服務器一致,只不過控件名不同而已):
Private Sub cmdSend_Click()
wskClient.SendData txtMessage.Text '發(fā)送數(shù)據(jù)
txtContent.Text = vbCrLf & txtContent.Text & "我說:" & txtMessage.Text '加到聊天記錄中
txtContent.Text=""
End SubPrivate Sub wskClient_DataArrival(ByVal bytesTotal As Long)
Dim tempS As String
wskClient.GetData tempS '接收數(shù)據(jù)
txtContent.Text = txtContent.Text & "對方說:" & tempS & vbCrLf '加到聊天記錄中
End Sub
生成EXE文件(名為:Client.exe)。這樣一個聊天器就做好了,在本機也可以試試,運行方法是先打開Server.exe,后打開Client.exe,然后在Client.exe點擊連接按鈕,連接地址為"127.0.0.1",確定,然后在下面的文本框輸入內(nèi)容點發(fā)送按鈕即可。在建立連接后Server.exe的操作方法和Client.exe的操作方法一樣。試試吧!
最后說一句:實際上我們會發(fā)現(xiàn)這樣的聊天器怎么會分為兩個部份呢,這樣多不方便。實際上我們可以合成一個,即在一個窗體上放一個wskServer再放一個wskClient,這樣就OK了,這里是為了更好的說明就放分成兩個的。還有就是這個聊天器是基于TCP協(xié)議,這個協(xié)議保證了通信的數(shù)據(jù)不會丟失,這個協(xié)議只能一對一,但在實際中我們聊天的對象不會是一個人吧,這樣就要用到可以一對多但不保證數(shù)據(jù)能完全到達UDP協(xié)議了,簡單而言TCP用于一對一,而UDP可以運用于一對多。下一節(jié)我們將介紹用Winsock制作一個簡單的Web服務器。
在本節(jié)中,我們將制作一個簡單的Web服務器(點擊這里下載源文件)。
按上節(jié)的說法,我們可以把Web服務器看是一個服務端,而瀏覽器則是一個一個的客戶端,他們以一個相同的端口(如HTTP默認為80,F(xiàn)TP默認為21),所以就能通信。他們的工作流程大概如下:首先Web服務器在某一端口上等待瀏覽器的連接,然后瀏覽器向目標Web服務器發(fā)出要求瀏覽某一網(wǎng)頁的請求,最后Web服務根據(jù)請求發(fā)送相應的網(wǎng)頁源文件給瀏覽器。
用過ASP的都知道,我們有一個Web服務器叫IIS,這個服務器就是根據(jù)瀏覽器的請求而產(chǎn)生相應的源碼然后發(fā)送到用戶的瀏覽器上的。
別的不多說,界面很簡單:
|
將文本框設置可以顯示多行文本。為了有別于其他,我們這個Web服務器將使用端口124。制作流程如下:
在Form_Load事件中將服務器的偵聽端口設為124:
Private Sub Form_Load()
wskServer.LocalPort = 124
wskServer.Listen
End Sub
在wskServer的ConnectionRequest事件中接受客戶端(瀏覽器)的連接:
Private Sub wskServer_ConnectionRequest(ByVal requestID As Long)
If wskServer.State <> sckClosed Then
wskServer.Close
End If
wskServer.Accept requestID
End Sub
在wskServer控件的DataArrival事件中加當瀏覽器的請求文本來時發(fā)送源代碼過去:
Private Sub wskServer_DataArrival(ByVal bytesTotal As Long)
'Dim tempS As String
'wskServer.GetData tempS
'txtMain.Text = tempS
txtMain.Text = txtMain.Text & "一個IP為[" & wskServer.RemoteHostIP & "]連接對象" & vbCrLf
sendCode ("index.htm")
End Sub
這里在窗體模塊(窗體聲明)中加入一個發(fā)送源代碼的sendCode的Sub過程:
Sub sendCode(fileName As String)
Open App.Path & "\" & fileName For Input As #1
Dim tempS As String
Do While Not EOF(1)
Line Input #1, tempS
wskServer.SendData tempS
Loop
Close #1
End Sub
在cmdClose的Click事件中關(guān)閉窗體和服務:
Private Sub cmdClose_Click()
wskServer.Close
Unload Me
End
End Sub
最后要在wskServer的SendComplete事件中加入如下代碼:
Private Sub wskServer_SendComplete()
wskServer.Close
End Sub
這里制作好了,將工程文件保存在[C:\temp]文件夾中,然后自己做一個網(wǎng)頁名為index.htm也放在[C:\temp]中。這時按F5運行,然后打開IE,輸入:http://127.0.0.1:124,這下等網(wǎng)頁的顯示吧。
這只是一個簡單的Web服務器,只能給你們說明一些原理,下面說幾個問題:
實際上我們給Web服務器發(fā)送連接會有一個文本請求來說明自己要的是什么文件,比如你把上面的wskServer的DataArrival事件中的前三行取消注釋,再次按上面的方法來運行一次,不過這次把請求網(wǎng)址改為:"http://127.0.0.1/1.htm",那么文本框中會顯示瀏覽器的請求文本為(以我的瀏覽器為例):
GET /1.htm HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: 127.0.0.1:124
Connection: Keep-Alive
你看第一行就知道客戶端要的是什么文件了。
回答這個問題你可以將wskServer.Close注釋起來再次運行,你會發(fā)現(xiàn)要很久(或要刷新網(wǎng)頁)才會有頁面出現(xiàn),這是因為如果服務一直在的話,那么瀏覽器以為服務的數(shù)據(jù)沒有傳完,就一直等待,所以要在傳送完源代碼時關(guān)閉服務器。
能。我們可以用Winsock下載網(wǎng)頁的源代碼,但在VB中我們有另一個功能更強大的控件來做我們的瀏覽器,將在下節(jié)中說明具體的做法。
我們前面的程序都只說到使用Winsock制作一對一的連接,實際上我們使用控件數(shù)組的話,那么可以制作一個多客戶連接的服務器。不過本質(zhì)上還是一對一,不過是服務器上不只一個Windsock而已。
我們在窗體上放一個Winsock,將他的Name改為sckServer,index屬性改為0。然后就是代碼了:
clientCount As Integer '定義一個窗體級變量來記錄客戶的連接數(shù)。
Private Sub Form_Load()
clientCount = 0
sckServer(0).LocalPort = 2000 '設置好偵聽端口
sckServer(0).Listen '開始偵聽
End SubPrivate Sub sckServer_ConnectionRequest (Index As Integer, ByVal requestID As Long)
If Index = 0 Then
clientCount = clientCount + 1 '客戶請求多一個
Load sckServer(clientCount) '載入一個服務端為新增的客戶服務
sckServer(clientCount).LocalPort = 0 '偵聽端口為隨機,不能設為2000,因為有sckServer(0)在使用了。
sckServer(clientCount).Accept requestID '接受請求
End If
End Sub
看了代碼明白了吧,所謂多客戶服務器就是多個Winsock服務端在為客戶服務而已,當然我們不用同步的時候也可以用一個Winsock來連續(xù)的關(guān)閉、連接來做多客戶服務器也是可以的。
在VB6.0中Web瀏覽器控件是WebBrowser,他的作用是讓我們只要加入少量的代碼,就能做出和IE功能一樣強大的瀏覽器。(
WebBrowser的功能強大是由眾多方法、屬性和行為組成的,下面說下它的主要屬性、方法和行為。
屬性名 | 說明 |
LocationURL | 返回當WebBrower中網(wǎng)頁的URL |
LocationName | 返回當WebBrower中網(wǎng)頁的標題,即HTML中的Title標記 |
方法名 | 作用 |
Navigate | 瀏覽網(wǎng)頁。如:WebBrower.Navigate "http://junqing124.update.vip2.com" |
GoBack | 后退 |
GoForward | 前進 |
GoHome | 瀏覽主頁 |
GoSearch | 打開搜索頁面 |
Refresh | 刷新 |
Stop | 停止 |
事件名 | 說明 |
DownloadBegin | 頁面開始下載 |
DownloadComplete | 頁面下載完畢 |
TitleChange | 瀏覽器的Title改變,即瀏覽新的頁面 |
這里簡單說了下WebBrower控件的部份屬性、方法和行為。
下面是一個示例:
|
上面的四個按鈕的名字分別為Command1、Command2、Command3、Command4,下面的文本框為Text1,最下面的是一個WebBrowser,名字為WebBrowser1
在Command1的Click事件加入:WebBrowser1.GoBack
在Command2的Click事件加入:WebBrowser1.GoForward
在Command3的Click事件加入:WebBrowser1.Refresh
在Command4的Click事件加入:If WebBrowser1.Busy = True Then WebBrowser1.Stop
在Text1的KeyPress事件加入:If KeyAscii = 13 Then WebBrowser1.Navigate Text1.Text
按F5運行,在文本輸入網(wǎng)址后回車看看效果吧!
聯(lián)系客服