如同上面的內(nèi)容所描述的,不論您使用UDP協(xié)議或是TCP協(xié)議,Winsock控件都可以允許與遠(yuǎn)程的設(shè)備連接,并且在相互之間交換數(shù)據(jù)。因此,依據(jù)上面的面熟而言,不論您使用的是哪一種協(xié)議都可以扮演主機(jī)端和客戶(hù)端的角色。
同時(shí),當(dāng)您在使用Winsock控件的過(guò)程中,這個(gè)控件不會(huì)顯示在正在執(zhí)行的窗體之中。換句話說(shuō),Winsock控件是在后臺(tái)運(yùn)行的一種控件。在執(zhí)行過(guò)程之中,不會(huì)具有任何選用、可見(jiàn)的控件。那么該如何使用Winsock控件呢?它可以被應(yīng)用在那些類(lèi)型的應(yīng)用程序之中呢?以下所列出的內(nèi)容,是這個(gè)控件可以應(yīng)用的大致范圍:
1)、將客戶(hù)端所收集的數(shù)據(jù),傳送給主機(jī)端。
2)、點(diǎn)對(duì)點(diǎn)的文件傳送。
3)、聊天室應(yīng)用程序。
4)、電子公告欄。
5)、voip(voice over TCP/ip)
因此,當(dāng)您希望建立上述類(lèi)型的應(yīng)用程序之前,必須要學(xué)習(xí)如何選用適合的協(xié)議類(lèi)型。
一、如何選用適用的協(xié)議
當(dāng)您準(zhǔn)備開(kāi)始使用Winsock控件之前,首要的工作是如何選擇適用的協(xié)議類(lèi)型。如同先前所述的,您可以選擇TCP 協(xié)議或是UDP協(xié)議中的一種。但是這兩種協(xié)議的差異點(diǎn)在哪里呢?雖然,它們同樣可以使用在Internet或是Internet環(huán)境之中,但是主要的差異在于連接的狀態(tài)。以下是這兩種協(xié)議的特點(diǎn)說(shuō)明:
1)、TCP協(xié)議是屬于面向連接的協(xié)議。所謂的面向連接協(xié)議是指——“在您可以交換數(shù)據(jù)之前,在兩個(gè)終端設(shè)備之間必須連接成功”。同時(shí),在網(wǎng)絡(luò)的基礎(chǔ)理論之中,都會(huì)特別強(qiáng)調(diào)TCP具有錯(cuò)誤核對(duì)的功能。也就是說(shuō),在數(shù)據(jù)的傳送過(guò)程中,如果發(fā)生錯(cuò)誤或是數(shù)據(jù)無(wú)法傳達(dá)對(duì)方時(shí),TCP協(xié)議將會(huì)重復(fù)嘗試著重新傳送數(shù)據(jù)。因此,核對(duì)以及重新傳送的能力,因此起傳輸效率會(huì)比Internet協(xié)議或是巨域網(wǎng)絡(luò)協(xié)議差一些(netBIEUI、IPX、AppleTalk)。
2)、UDP協(xié)議是屬于無(wú)面向連接協(xié)議。這種協(xié)議為適用在兩個(gè)設(shè)備之間,適用于信息傳送以及數(shù)據(jù)的傳輸方面。但是在使用時(shí),必須注意當(dāng)你將信息送出時(shí),對(duì)方可能已經(jīng)離線,因而無(wú)法接收到數(shù)據(jù),而您也無(wú)法實(shí)時(shí)察覺(jué)到對(duì)方已經(jīng)離線。此外,使用UDP協(xié)議的最大數(shù)據(jù)傳送量,完全取決于網(wǎng)絡(luò)的傳輸量。因此,此種協(xié)議較為適用于局域網(wǎng)絡(luò)。
因此,當(dāng)您在建立應(yīng)用程序并且選用適當(dāng)?shù)膮f(xié)議之前,務(wù)必先依據(jù)應(yīng)用程序使用的環(huán)境來(lái)選擇適用的協(xié)議。
二、設(shè)置協(xié)議
當(dāng)已經(jīng)選擇好適當(dāng)?shù)膮f(xié)議之后,接下來(lái),將必須要設(shè)置協(xié)議的類(lèi)型。在Visable Basic之中,共有兩種設(shè)置協(xié)議的方式:“修改屬性窗口”以及“程序代碼設(shè)置”。以下是這兩種設(shè)置方式的說(shuō)明。
1)、修改屬性窗口(見(jiàn)下圖)

2)、程序代碼設(shè)置
Winsock1.Protocol=sckTCPProtocol
三、TCP連接的基礎(chǔ)
在使用TCP協(xié)議來(lái)建立應(yīng)用程序的過(guò)程中,首先必須決定應(yīng)用程序是屬于主機(jī)端
是客戶(hù)端來(lái)決定應(yīng)用程序所扮演的角色問(wèn)題。因此,在建立應(yīng)用程序的過(guò)程中,如果您選擇“主機(jī)端”時(shí),主機(jī)端的Winsock控件必須將特定的連接端口號(hào)設(shè)置在監(jiān)聽(tīng)模式之中。同時(shí),在客戶(hù)端提出連接的請(qǐng)求時(shí),主機(jī)端可以允許客戶(hù)端的連接請(qǐng)求,并且完成連接的程序。
因此,一旦主機(jī)端與客戶(hù)端連接成功之后,在這個(gè)部設(shè)備之間即可開(kāi)始傳送數(shù)據(jù),以下的程序代碼,具有TCP連接的基本聊天室功能。
1、TCP連接范例
在此筆者只做簡(jiǎn)單的-程序介紹,
frmserver窗體的設(shè)計(jì)內(nèi)容
如下圖所示

frmserver的程序代碼
private sub form_load()
‘設(shè)置本機(jī)連接端口的localport屬性的內(nèi)容
‘請(qǐng)注意!必須是整體值
tcpserver.LocalPort=2000
‘將本機(jī)連接端口設(shè)置為監(jiān)聽(tīng)模式
tcpserver.Listen
Me.Caption=”frmsever”
Label1.Caption=”傳送的文字“
Label2.Caption=”接收的文字“
‘打開(kāi)frmclient窗體
frmClient.Show
end sub
private sub tcpserver_connectionrequest(byval requestid as long)
‘如果tcpserver 控件的狀態(tài)目前不是處于關(guān)
‘閉的狀態(tài)時(shí),在允許遠(yuǎn)程設(shè)備連接時(shí),必須要關(guān)閉目前的控制的運(yùn)行
if tcpserver.state<>sckclosed then tcpserver..close
‘允許遠(yuǎn)程設(shè)備使用必要的識(shí)別碼(requestid)與主機(jī)進(jìn)行連接
tcpserver.accept requestid
end sub
private sub txtsend_change()
‘當(dāng)txtsend控件的內(nèi)容發(fā)生變化時(shí),將txtsend控件的內(nèi)容,通過(guò)tcpserver控件senddata方
‘法,將txtsend控件的內(nèi)容傳送給frmclient
tcpserver.senddata txtsend.text
end sub
private sub tcpserver_dataarrival(byval bytestotal as long)
‘聲明即將接收的數(shù)據(jù)類(lèi)型
dim strdata as string
‘調(diào)用tcpserver控件的getdata方法,將接收的數(shù)據(jù)以vbstring數(shù)據(jù)類(lèi)型,存放在strdata變量之中。
Tcpserver.getdata strdata ,vbstring
‘將strdata變量的內(nèi)容,存放在txtoutput控件之中。
Txtreceive.text =strdata
End sud
frmclient窗體的設(shè)計(jì)內(nèi)容
窗體的配置內(nèi)容如圖3-2

程序的代碼
private sub form_load()
‘指定遠(yuǎn)程主機(jī)的ip地址。如果是localhost,代表的ip地址為127.0.0.1,并且也代表本機(jī)。
Tcpclient.RemoteHost=”localhost”
‘設(shè)置本機(jī)連接端口的localport屬性的內(nèi)容
‘請(qǐng)注意!必須是整體值
tcpclient.remoteport=2000
‘設(shè)置窗體的標(biāo)題內(nèi)容
Me.Caption=”frmclient”
Label1.caption=”傳送的文字”
Label2.caption=”接收的文字”
Cmdconnect.caption=”與主機(jī)連接”
End sub
Private sub cmdconnect_click()
‘調(diào)用tcpclient控件的connect方法,來(lái)初始化與主機(jī)的連接請(qǐng)求
tcpclient.connect
end sub
private sub txtsend_change()
‘當(dāng)txtsend控件的內(nèi)容發(fā)生變化時(shí),立即調(diào)用tcpclient控件的senddata方法,將txtsend控件的內(nèi)容傳送給主機(jī)
tcpclient.senddata txtsend.text
end sub
private sub tcpclient_dataarrival(byval bytestotal as long)
‘說(shuō)明即將接收的數(shù)據(jù)類(lèi)型
dim strdata as string
‘調(diào)用tcpclient控件的getdata方法,將接收的數(shù)據(jù)以vbstring數(shù)據(jù)類(lèi)型存放strdata變量之中。
Tcpclient.getdata strdata,vbstring
‘將strdata變量的內(nèi)容,存放在txtoutput控件之中。
Txtreceive.text=strdata
End sub
程序的執(zhí)行結(jié)果
