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