VB網路編程中Winsock的使用
?不論您使用UDP協議或是TCP協議,Winsock控制元件都可以允許與遠程的設備連接,并且在相互之間交換資料。因此,依據上面的面熟而言,不論您使用的是哪一種協議都可以扮演主機端和客戶端的角色。
同時,當您在使用Winsock控制元件的程序中,這個控制元件不會顯示在正在執行的表單之中。換句話說,Winsock控制元件是在后臺運行的一種控制元件。在執行程序之中,不會具有任何選用、可見的控制元件。那么該如何使用Winsock控制元件呢?它可以被應用在那些型別的應用程式之中呢?以下所列出的內容,是這個控制元件可以應用的大致范圍:
將客戶端所收集的資料,傳送給主機端。
點對點的檔案傳送。
聊天室應用程式。
電子公告欄。
voip(voice over TCP/ip)
因此,當您希望建立上述型別的應用程式之前,必須要學習如何選用適合的協議型別。 2-1如何選用適用的協議
當您準備開始使用Winsock控制元件之前,首要的作業是如何選擇適用的協議型別。如同先前所述的,您可以選擇TCP 協議或是UDP協議中的一種。但是這兩種協議的差異點在哪里呢?雖然,它們同樣可以使用在Internet或是Internet環境之中,但是主要的差異在于連接的狀態。以下是這兩種協議的特點說明:
TCP協議是屬于面向連接的協議。所謂的面向連接協議是指——“在您可以交換資料之前,在兩個終端設備之間必須連接成功”。同時,在網路的基礎理論之中,都會特別強調TCP具有錯誤核對的功能。也就是說,在資料的傳送程序中,如果發生錯誤或是資料無法傳達對方時,TCP協議將會重復嘗試著重新傳送資料。因此,核對以及重新傳送的能力,因此起傳輸效率會比Internet協議或是巨域網路協議差一些(netBIEUI、IPX、AppleTalk)。
UDP協議是屬于無面向連接協議。這種協議為適用在兩個設備之間,適用于資訊傳送以及資料的傳輸方面。但是在使用時,必須注意當你將資訊送出時,對方可能已經離線,因而無法接收到資料,而您也無法實時察覺到對方已經離線。此外,使用UDP協議的最大資料傳送量,完全取決于網路的傳輸量。因此,此種協議較為適用于局域網路。
因此,當您在建立應用程式并且選用適當的協議之前,務必先依據應用程式使用的環境來選擇適用的協議。
2-2設定協議
當已經選擇好適當的協議之后,接下來,將必須要設定協議的型別。在Visable Basic之中,共有兩種設定協議的方式:“修改屬性視窗”以及“程式代碼設定”。以下是這兩種設定方式的說明。 修改屬性視窗(見圖2-1)
程式代碼設定
Winsock1.Protocol=sckTCPProtocol
3.TCP連接的基礎
在使用TCP協議來建立應用程式的程序中,首先必須決定應用程式是屬于主機端 是客戶端來決定應用程式所扮演的角色問題。因此,在建立應用程式的程序中,如果您選擇“主機端”時,主機端的Winsock控制元件必須將特定的連接埠號設定在監聽模式之中。同時,在客戶端提出連接的請求時,主機端可以允許客戶端的連接請求,并且完成連接的程式。
因此,一旦主機端與客戶端連接成功之后,在這個部設備之間即可開始傳送資料,以下的程式代碼,具有TCP連接的基本聊天室功能。
3-1TCP連接范例
在此筆者只做簡單的-程式介紹,
frmserver表單的設計內容
如圖3-1所示
frmserver的程式代碼
private sub form_load()
設定本機連接埠的localport屬性的內容
請注意!必須是整體值
tcpserver.LocalPort=2000
?將本機連接埠設定為監聽模式
tcpserver.Listen
Me.Caption=”frmsever”
Label1.Caption=”傳送的文字“
Label2.Caption=”接收的文字“
?打開frmclient表單
frmClient.Show
end sub
private sub tcpserver_connectionrequest(byval requestid as long)
如果tcpserver 控制元件的狀態目前不是處于關
閉的狀態時,在允許遠程設備連接時,必須要關閉目前的控制的運行
if tcpserver.state<>sckclosed then tcpserver..close
允許遠程設備使用必要的識別碼(requestid)與主機進行連接
tcpserver.accept requestid
end sub
private sub txtsend_change()
當txtsend控制元件的內容發生變化時,將txtsend控制元件的內容,通過tcpserver控制元件senddata方
法,將txtsend控制元件的內容傳送給frmclient
tcpserver.senddata txtsend.text
end sub
private sub tcpserver_dataarrival(byval bytestotal as long)
宣告即將接收的資料型別
dim strdata as string
呼叫tcpserver控制元件的getdata方法,將接收的資料以vbstring資料型別,存放在strdata變數之中。
Tcpserver.getdata strdata ,vbstring
tcpclient.remoteport=2000
設定表單的標題內容
Me.Caption=”frmclient”
Label1.caption=”傳送的文字”
Label2.caption=”接收的文字”
Cmdconnect.caption=”與主機連接”
End sub
Private sub cmdconnect_click()
?呼叫tcpclient控制元件的connect方法,來初始化與主機的連接請求
tcpclient.connect
end sub
private sub txtsend_change()
?當txtsend控制元件的內容發生變化時,立即呼叫tcpclient控制元件的senddata方法,將txtsend控制元件的內容傳送給主機
tcpclient.senddata txtsend.text
end sub
private sub tcpclient_dataarrival(byval bytestotal as long)
?說明即將接收的資料型別
dim strdata as string
?呼叫tcpclient控制元件的getdata方法,將接收的資料以vbstring資料型別存放strdata變數之中。
Tcpclient.getdata strdata,vbstring
?將strdata變數的內容,存放在txtoutput控制元件之中。
Txtreceive.text=strdata
End sub
程式的執行結果
3-1-1如何允許更多客戶端同時連接
當您的應用程式架構是屬于主從式架構時,一般來說,客戶端應該不止一個而已。但是,如果每一個客戶端使用的一組連接埠時,那么如果有100個客戶端呢?如果有1000個客戶端呢?那么究竟要增加多少個winsock控制元件呢?同時,也得要分成100(或是1000)組accept子程式,接著每一部客戶端都必須記得固定的連接埠號。
其實,您大可不必如此辛苦。您可以利用Visable Basic控制元件陣列的方式并利用監聽用的陣列元素(一般都是索引值“0”),來觸發ConnectRequest事件。接下來再利用判別控制元件陣列元素的連接狀態來進行遠程客戶端連接。以下的程式代碼范例,就是如何讓許多遠程用戶連接到同一個連接埠號的程式代碼的模板:
private connmax as long
private sub form_load ()
dim I as integer
connmax =200
sckserver(0).localport=1001
sckserver(0).listen
for I =1 to connmax
load sckserver(i)
next
end sub
private sub sckserver_connectionrequest(index as integer,byval requestid as long)
dim I as intege
for I =1 to connmax
if sckserver(1).state=sckclosed then
sckserver(I).accept requestid
end if
end if
end sub
在上述的程式范例中,將會建立一個具有“201”個元素的sckserver控制元件陣列。接著,利用for。。。next回圈的方式,來設定加載sckserver控制元件陣列元素或是判斷陣列元素是否正在連接中進而允許客戶端連接。至于sckserver控制元件陣列總元素為“201”的原因在于——“connmax設定為200再加上sckserver(0),因此總元素數量為201”。
4.UDP連接的基礎
在 建立UDP的應用程式時,其程序會比TCP協議簡單許多。這是由于UDP協議在資料傳送之前,可以不需要特別明確的連接方式。但是,在上述的TCP連接方式之中,Winsocke控制元件必須設定在“監聽(Linsten)”狀態之下,同時在客戶端準備與主機進行連接時,主機端也必須要使用Accept方法來允許客戶端所要求的連接。
反觀在UDP協議方面,雙方僅僅需要使用Bind方法,即可與對方連接并且傳輸數九,因此,UDP協議連接程序的處理方式確實比TCP簡單許多。下面介紹使用UDP協議來傳送資訊的程序。
4-1UDP的連接范例
在此只做簡單的介紹
表單frm PeerA的設計內容
如圖4-1所示
表單的程式代碼
Private Sub Form_Load()
′控制元件的名字為udpPeerA
With udpPeerA′重點:必須將 RemoteHost 的值修改為對方計算機的名字。 RemoteHost= ″PeerB″
RemotePort = 1001 ′連接的埠號。
Bind 1002 ′系結到本地的埠。
End With
frmPeerB.Show′顯示第二個表單。
End Sub
Private Sub txtSend_Change()
′在鍵入文本時,立即將其發送出去。
udpPeerA.SendData txtSend.Text
End Sub
Bind 1001 ′系結到本地的埠上。
End With
End Sub
Private Sub txtSend_Change()
′在鍵入后立即發送文本。
udpPeerB.SendData txtSend.Text
End Sub
Private Sub udpPeerB_DataArrival (ByVal bytesTotal As Long) Dim strData As String
udpPeerB.GetData strData
txtOutput.Text = strData
End Sub
轉載請保留出處,http://www.360docs.net/doc/info-f8cb3b19ff00bed5b9f31d16.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/72155.html
標籤:網絡編程
