电竞比分网-中国电竞赛事及体育赛事平台

分享

Vb6.0 中使用 Winsock 控件

 nxhujiee 2019-03-24
━━━━━━━━━━━━━━━━━━━━━━━━━

一、Winsock 控件工作原理
利用 w insock 控件可以與遠程計算機建立連接,并通過用
戶數(shù)據(jù)文報協(xié)議 (U D P)或者傳輸控制協(xié)議 (TCP)進行數(shù)據(jù)交
換。這兩種協(xié)議都可以用來創(chuàng)建客戶與服務器應用程序。用途:
(1)創(chuàng)建收集用戶信息的客戶端應用程序,并將收集的信息
發(fā)送到某中央服務器;
(2)創(chuàng)建一個服務器應用程序,作為多個用戶的數(shù)據(jù)的匯入點;
(3)創(chuàng)建“聊天”應用程序。

二、用 Winsock 控件進行編程的過程
(一)選擇通訊協(xié)議
在使用 winsock 控件時,首先需要考慮使用什么協(xié)議???
以使用的協(xié)議包括 TCP 和 UDP。兩種協(xié)議之間的重要區(qū)別在
于它們的連接狀態(tài): TCP 協(xié)議控件是基于連接的協(xié)議。在開
始數(shù)據(jù)傳輸之前,用戶必須先建立連接。UDP 協(xié)議是一種無
連接協(xié)議,消息從一臺計算機發(fā)送到另一臺計算機,但是兩者
之間沒有明確的連接。 到底選擇哪一種協(xié)議通常是由需要創(chuàng)
建的應用程序決定的。

下面的幾個問題將有助于選擇適宜的協(xié)議:

在收發(fā)數(shù)據(jù)的時候,應用程序是否需要得到客戶端或者服
務器的確認信息?如果需要,使用 TCP 協(xié)議,在收發(fā)數(shù)據(jù)之
前先建立明確的連接。

數(shù)據(jù)量是否特別大(例如圖象與聲音文件)?在連接建立
之后,TCP 協(xié)議將維護連接并確保數(shù)據(jù)的完整性。不過,這種
連接需要更多的計算資源,因而是比較“昂貴”的。

數(shù)據(jù)發(fā)送是間歇的,還是在一個會話內?例如,如果應用
程序在某個任務完成的時候需要通知某個計算機,UDP 協(xié)議
是更適宜的。UDP 協(xié)議適合發(fā)送少量的數(shù)據(jù)。

(二)協(xié)議的設置
在設計時,可以按如下方式設置應用程序使用的協(xié)議:在
“屬性”窗口中單擊“協(xié)議”,然后選擇 sckTCPProtocol 或者
sckUDPProtocol。也可以使用程序代碼來設置 Protocol 屬性,
如下所示: Winsock1.Protocol sckTCPProtocol

(三)確定計算機的名稱
在與遠程計算機相連接的時候,需要知道它的 IP 地址或
者它的“好聽的名字”。IP 地址是一串數(shù)字,每三個數(shù)字為一
組,中間用點隔開(形如 xxx.xxx.xxx.xxx)。通常,最易記住
的是計算機的“好聽的名字”。上面找到的計算機名稱可以作
為 RemoteHost 屬性的值。

(四)TCP 連接初步
如果應用程序要使用 TCP 協(xié)議,那么首先必須決定應用程序
是服務器還是客戶端。如果要創(chuàng)建一個服務器端,那么應
用程序需要“監(jiān)聽”指定的端口。當客戶端提出連接請求時,
服務器端能夠接受請求并建立連接。在連接建立之后,客戶端
與服務器端可以自由地互相通訊。


下列步驟創(chuàng)建一個非常簡單的服務器:

(五)創(chuàng)建一個 TCP 服務器

請按照以下步驟執(zhí)行:
創(chuàng)建新的 Standard EXE 工程。
將缺省窗體的名稱改為 frmServer。
將窗體的標題改為“TCP 服務器”。
在窗體中放入一個 winsock 控件,并將它的名字改為
tcpServer。
在窗體上添加兩個 TextBox 控件。將第一個命名為
txtSendD ata,第二個為 txtO utput。

為窗體添加如下的代碼。
Private Sub Form_Load()        '將 LocalPort 屬性設置為一個整
    
數(shù),然后調用 Listen 方法。
    tcpServer.LocalPort 1001
    tcpServer.Listen
    frmClient.Show         '顯示客戶端的窗體。
End Sub

Private Sub 
tcpServer_ConnectionRequest _
    (ByVal requestID As Long)
    
' 檢查控件的 State 屬性是否為關閉的。
    ' 如果不是,在接受新的連接之前先關閉此連接。
    
If tcpServer.State <> sckClosed Then _
    tcpServer.Close
    
' 接受具有 requestID 參數(shù)的連接。
    
tcpServer.Accept requestID
End Sub

Private Sub 
txtSendData_Change()
    
tcpServer.SendData txtSendData.Text         ' 包含了要發(fā)送的數(shù)據(jù) 
End Sub

Private Sub 
tcpServer_DataArrival _
    (ByVal bytesTotal As Long)
    
Dim strData As String
    
tcpServer.GetData strData
    txtOutput.Text strData
End Sub


(六)創(chuàng)建 TCP 客戶

按照以下步驟執(zhí)行 :
在工程中添加一個新的窗體,將其命名為 frmClient。
將窗體的標題改為“TCP Client”。
在 窗 體 中 添 加一 個 winsock 控 件 , 并 將 其 命名為
tcpClient。
在 frmClient 中添加兩個 TextBox 控件。將第一個命名
為 txtSend,第二個為 txtOutput。
在窗體上放一個 CommandButton 控件,并將其命名為
cmdConnect。
將 CommandButton 控件的標題改為 Connect。

在窗體中添加如下的代碼。
Private Sub Form_Load()
    
tcpClient.RemoteHost "RemoteComputerName"
    tcpClient.RemotePort 1001
End Sub

Private Sub 
cmdConnect_Click()
    
' 調用 Connect 方法,初始化連接。
    
tcpClient.Connect
End Sub

Private Sub 
txtSendData_Change()
    
tcpClient.SendData txtSend.Text
End Sub

Private Sub 
tcpClient_DataArrival _
    (ByVal bytesTotal As Long)
    
Dim strData As String
    
tcpClient.GetData strData
    txtOutput.Text strData
End Sub

上面的代碼創(chuàng)建了一個簡單的客戶 / 服務器模式的應用程
序。我們可以將兩者都運行起來:運行工程,然后單擊“連接”。
在兩個窗體之一的 txtSendData 文本框中鍵入文本,可以看到
同樣的文字將出現(xiàn)在另一個窗體的 txtOutput 文本框中。


(七)創(chuàng)建 UDP 應用程序

創(chuàng)建 UDP 應用程序比創(chuàng)建 TCP 應用程序還要簡單,因
為 UDP 協(xié)議不需要顯式的連接。第四、五、六步驟不用設計。
在上面的 TCP 應用程序中,一個 winsock 控件必須顯式地進
行“監(jiān)聽”,另一個必須使用 Connect 方法初始化連接。UDP 協(xié)
議不需要顯式的連接。要在兩個控件中間發(fā)送數(shù)據(jù),需要完成
以下的三步(在連接的雙方):

將 RemoteHost 屬性設置為另一臺計算機的名稱。
將 RemotePort 屬性設置為第二個控件的 LocalPort 屬
性。
調用 Bind 方法,指定使用的 LocalPort。
因為兩臺計算機的地位可以看成“平等的”,這種應用程
序也被稱為點到點的。

為了具體說明這個問題,下面將創(chuàng)建一
個“聊天”應用程序,兩個人可以通過它進行實時的交談。
要創(chuàng)建一個 UDP 伙伴,請按照以下步驟執(zhí)行:

創(chuàng)建一個新的 Standard EXE 工程。
將缺省的窗體的名稱修改為 frmPeerA。
將窗體的標題修改為“Peer A”。
在 窗 體 中 放 入 一 個 winsock 控 件 , 并 將 其 命名為
udpPeerA。
在“屬性”頁上,單擊“協(xié)議”并將協(xié)議修改為UDPProtocol。
在窗體中添加兩個 TextBox 控件。將第一個命名為
txtSend,第二個命名為 txtOutput。
為窗體增加如下的代碼。

Private Sub Form_Load()
    .
RemoteHost "PeerB"
    . RemotePort 1001         ' 連接的端口號。
    .
Bind 1002         ' 綁定到本地的端口。
    
frmPeerB.Show         ' 顯示第二個窗體。
End Sub

Private Sub 
txtSend_Change()
    
' 在鍵入文本時,立即將其發(fā)送出去。
    
udpPeerA.SendData txtSend.Text
End Sub

Private Sub 
udpPeerA_DataArrival _
    (ByVal bytesTotal As Long)
    
Dim strData As String
    
udpPeerA.GetData strData
    txtOutput.Text strData
End Sub

要創(chuàng)建第二個 UDP 伙伴,請按照以下步驟執(zhí)行:
在工程中添加一個標準窗體。
將窗體的名字修改為 frmPeerB。
將窗體的標題修改為“Peer B”。
在窗體中放入一個 winsock 控件,并將其命名為
udpPeerB。
在“屬性”頁上,單擊“協(xié)議”并將協(xié)議修改為
“UDPProtocol”。
在窗體上添加兩個 TextBox 控件。將第一個命名為
txtSend,第二個命名為 txtOutput。

在窗體中添加如下的代碼。

Private Sub Form_Load()
    
RemoteHost "PeerA"
    RemotePort 1002         ' 要連接的端口。
    
Bind 1001         ' 綁定到本地的端口上。
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

如果要試用上面的例子,按 F5 鍵運行工程,然后在兩個
窗體的 txtSend TextBox 中分別鍵入一些文本。鍵入的文字將
出現(xiàn)在另一個窗體的 txtOutput TextBox 中。

三、結束語

上面介紹了在 vb6.0 下進行 winsock 控件的編程方法與技
巧,在實際的應用中,vb 可以直接調用 winsock 控件,這讓我
們在 vb 下面編寫網(wǎng)絡通訊程序變的簡單和愉快。

[責任編輯:尤書才] 

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多