如同上面的內容所描述的不論您使用UDP協議或是TCP協議Winsock控件都可以允許與遠程的設備連接並且在相互之間交換數據因此依據上面的面熟而言不論您使用的是哪一種協議都可以扮演主機端和客戶端的角色
同時當您在使用Winsock控件的過程中這個控件不會顯示在正在執行的窗體之中換句話說Winsock控件是在後台運行的一種控件在執行過程之中不會具有任何選用可見的控件那麼該如何使用Winsock控件呢?它可以被應用在那些類型的應用程序之中呢?以下所列出的內容是這個控件可以應用的大致范圍
;將客戶端所收集的數據傳送給主機端
;點對點的文件傳送
;聊天室應用程序
;電子公告欄
;voip(voice over TCP/ip)
因此當您希望建立上述類型的應用程序之前必須要學習如何選用適合的協議類型
如何選用適用的協議
當您准備開始使用Winsock控件之前首要的工作是如何選擇適用的協議類型如同先前所述的您可以選擇TCP 協議或是UDP協議中的一種但是這兩種協議的差異點在哪裡呢?雖然它們同樣可以使用在Internet或是Internet環境之中但是主要的差異在於連接的狀態以下是這兩種協議的特點說明
;TCP協議是屬於面向連接的協議所謂的面向連接協議是指——在您可以交換數據之前在兩個終端設備之間必須連接成功同時在網絡的基礎理論之中都會特別強調TCP具有錯誤核對的功能也就是說在數據的傳送過程中如果發生錯誤或是數據無法傳達對方時TCP協議將會重復嘗試著重新傳送數據因此核對以及重新傳送的能力因此起傳輸效率會比Internet協議或是巨域網絡協議差一些(netBIEUIIPXAppleTalk)
;UDP協議是屬於無面向連接協議這種協議為適用在兩個設備之間適用於信息傳送以及數據的傳輸方面但是在使用時必須注意當你將信息送出時對方可能已經離線因而無法接收到數據而您也無法實時察覺到對方已經離線此外使用UDP協議的最大數據傳送量完全取決於網絡的傳輸量因此此種協議較為適用於局域網絡
因此當您在建立應用程序並且選用適當的協議之前務必先依據應用程序使用的環境來選擇適用的協議
設置協議
當已經選擇好適當的協議之後接下來將必須要設置協議的類型在Visable Basic之中共有兩種設置協議的方式修改屬性窗口以及程序代碼設置以下是這兩種設置方式的說明 ;修改屬性窗口(見圖)
;程序代碼設置
WinsockProtocol=sckTCPProtocol
.TCP連接的基礎
在使用TCP協議來建立應用程序的過程中首先必須決定應用程序是屬於主機端
是客戶端來決定應用程序所扮演的角色問題因此在建立應用程序的過程中如果您選擇主機端時主機端的Winsock控件必須將特定的連接端口號設置在監聽模式之中同時在客戶端提出連接的請求時主機端可以允許客戶端的連接請求並且完成連接的程序
因此一旦主機端與客戶端連接成功之後在這個部設備之間即可開始傳送數據以下的程序代碼具有TCP連接的基本聊天室功能
TCP連接范例
在此筆者只做簡單的程序介紹
;frmserver窗體的設計內容
如圖所示
;frmserver的程序代碼
private sub form_load()
設置本機連接端口的localport屬性的內容
請注意!必須是整體值
tcpserverLocalPort=
將本機連接端口設置為監聽模式
tcpserverListen
MeCaption=frmsever
LabelCaption=傳送的文字
LabelCaption=接收的文字
打開frmclient窗體
frmClientShow
end sub
private sub tcpserver_connectionrequest(byval requestid as long)
如果tcpserver 控件的狀態目前不是處於關
閉的狀態時在允許遠程設備連接時必須要關閉目前的控制的運行
if tcpserverstate<>sckclosed then tcpserverclose
允許遠程設備使用必要的識別碼(requestid)與主機進行連接
tcpserveraccept requestid
end sub
private sub txtsend_change()
當txtsend控件的內容發生變化時將txtsend控件的內容通過tcpserver控件senddata方
法將txtsend控件的內容傳送給frmclient
tcpserversenddata txtsendtext
end sub
private sub tcpserver_dataarrival(byval bytestotal as long)
聲明即將接收的數據類型
dim strdata as string
調用tcpserver控件的getdata方法將接收的數據以vbstring數據類型存放在strdata變量之中
Tcpservergetdata strdata vbstring
將strdata變量的內容存放在txtoutput控件之中
Txtreceivetext =strdata
End sud
;frmclient窗體的設計內容
窗體的配置內容如圖
;程序的代碼
private sub form_load()
指定遠程主機的ip地址如果是localhost代表的ip地址為並且也代表本機
TcpclientRemoteHost=localhost
設置本機連接端口的localport屬性的內容
請注意!必須是整體值
tcpclientremoteport=
設置窗體的標題內容
MeCaption=frmclient
Labelcaption=傳送的文字
Labelcaption=接收的文字
Cmdconnectcaption=與主機連接
End sub
Private sub cmdconnect_click()
調用tcpclient控件的connect方法來初始化與主機的連接請求
nnect
end sub
private sub txtsend_change()
當txtsend控件的內容發生變化時立即調用tcpclient控件的senddata方法將txtsend控件的內容傳送給主機
tcpclientsenddata txtsendtext
end sub
private sub tcpclient_dataarrival(byval bytestotal as long)
說明即將接收的數據類型
dim strdata as string
調用tcpclient控件的getdata方法將接收的數據以vbstring數據類型存放strdata變量之中
Tcpclientgetdata strdatavbstring
將strdata變量的內容存放在txtoutput控件之中
Txtreceivetext=strdata
End sub
;程序的執行結果
如何允許更多客戶端同時連接
當您的應用程序架構是屬於主從式架構時一般來說客戶端應該不止一個而已但是如果每一個客戶端使用的一組連接端口時那麼如果有個客戶端呢?如果有個客戶端呢?那麼究竟要增加多少個winsock控件呢?同時也得要分成(或是)組accept子程序接著每一部客戶端都必須記得固定的連接端口號
其實您大可不必如此辛苦您可以利用Visable Basic控件數組的方式並利用監聽用的數組元素(一般都是索引值)來觸發ConnectRequest事件接下來再利用判別控件數組元素的連接狀態來進行遠程客戶端連接以下的程序代碼范例就是如何讓許多遠程用戶連接到同一個連接端口號的程序代碼的模板
private connmax as long
private sub form_load ()
dim I as integer
connmax =
sckserver()localport=
sckserver()listen
for I = to connmax
load sckserver(i)
next
end sub
private sub sckserver_connectionrequest(index as integerbyval requestid as long)
dim I as intege
for I = to connmax
if sckserver()state=sckclosed then
sckserver(I)accept requestid
end if
end if
end sub
在上述的程序范例中將會建立一個具有個元素的sckserver控件數組接著利用fornext循環的方式來設置加載sckserver控件數組元素或是判斷數組元素是否正在連接中進而允許客戶端連接至於sckserver控件數組總元素為的原因在於——connmax設置為再加上sckserver()因此總元素數量為
.UDP連接的基礎
在 建立UDP的應用程序時其過程會比TCP協議簡單許多這是由於UDP協議在數據傳送之前可以不需要特別明確的連接方式但是在上述的TCP連接方式之中Winsocke控件必須設置在監聽(Linsten)狀態之下同時在客戶端准備與主機進行連接時主機端也必須要使用Accept方法來允許客戶端所要求的連接
反觀在UDP協議方面雙方僅僅需要使用Bind方法即可與對方連接並且傳輸數九因此UDP協議連接過程的處理方式確實比TCP簡單許多下面介紹使用UDP協議來傳送信息的過程
UDP的連接范例
在此只做簡單的介紹
;窗體frm PeerA的設計內容
如圖所示
;窗體的程序代碼
Private Sub Form_Load()
′控件的名字為udpPeerA
With udpPeerA′重點:必須將 RemoteHost 的值修改為對方計算機的名字
RemoteHost= ″PeerB″
RemotePort = ′連接的端口號
Bind ′綁定到本地的端口
End With
frmPeerBShow′顯示第二個窗體
End Sub
Private Sub txtSend_Change()
′在鍵入文本時立即將其發送出去
udpPeerASendData txtSendText
End Sub
Private Sub udpPeerA_DataArrival (ByVal bytesTotal As Long)
Dim strData As String
udpPeerAGetData strData
txtOutputText = strData
End Sub
;窗體frmpeerB的設計內容
如圖所示
;窗體frmpeerB的程序代碼
Private Sub Form_Load()
′控件的名字為 udpPeerB
With udpPeerB
′重點:必須將RemoteHost的值改為對方計算機的名字
RemoteHost= ″PeerA″
RemotePort = ′要連接的端口
Bind ′綁定到本地的端口上
End With
End Sub
Private Sub txtSend_Change()
′在鍵入後立即發送文本
udpPeerBSendData txtSendText
End Sub
Private Sub udpPeerB_DataArrival (ByVal bytesTotal As Long)
Dim strData As String
udpPeerBGetData strData
txtOutputText = strData
End Sub
From:http://tw.wingwit.com/Article/program/net/201311/12396.html