WinSock控件能夠通過(guò)UDP協(xié)議(用戶數(shù)據(jù)報(bào)協(xié)議)或TCP協(xié)議(數(shù)據(jù)傳輸協(xié)議)連接到遠(yuǎn)程的機(jī)器并進(jìn)行數(shù)據(jù)交換。這兩種協(xié)議都能用來(lái)創(chuàng)建客戶端和服務(wù)端應(yīng)用程序。就像定時(shí)器控件一樣,WinSock控件運(yùn)行時(shí)沒(méi)有一個(gè)可視的界面。
可能的用途
·創(chuàng)建客戶端應(yīng)用程序,它能在信息到達(dá)中央服務(wù)器之前把用戶的信息收集起來(lái)。
·創(chuàng)建服務(wù)端應(yīng)用程序,它能作為來(lái)自多個(gè)用戶的數(shù)據(jù)一個(gè)集中處理點(diǎn)。
·創(chuàng)建“聊天”程序。
協(xié)議的選擇
當(dāng)我們使用WinSock控件時(shí),首先要確定的是使用TCP還是UDP協(xié)議。它們之間主要的區(qū)別在于連接狀態(tài):
TCP協(xié)議控件是一個(gè)基于連接的協(xié)議,就像電話機(jī)一樣,用戶必須在通話之前建立連接;
UDP是一個(gè)無(wú)連接的協(xié)議,兩臺(tái)計(jì)算機(jī)之間的事務(wù)處理就像傳紙條一樣:一臺(tái)計(jì)算機(jī)向另一臺(tái)計(jì)算機(jī)發(fā)送消息,但是它們之間并沒(méi)有一個(gè)明確的連接路徑。另外,發(fā)送的單個(gè)信息量的大小取決于網(wǎng)絡(luò)。
通常,你要?jiǎng)?chuàng)建的應(yīng)用程序的類別就決定了你要選擇的協(xié)議。以下是幾個(gè)能夠幫助你選擇合適的協(xié)議的問(wèn)題:
當(dāng)發(fā)送或接收數(shù)據(jù)時(shí),該應(yīng)用程序需要從服務(wù)端或客戶端獲得認(rèn)證嗎?如果要的話,那么TCP協(xié)議就正好需要在發(fā)送或接受數(shù)據(jù)前建立明確的連接。
要發(fā)送的數(shù)據(jù)量大嗎?(就像圖片、聲音文件之類)一旦建立了連接,TCP協(xié)議就會(huì)保持連接并保證數(shù)據(jù)的完整性。但是,這種連接會(huì)占用的更多的處理器資源,成本也會(huì)更高一些。
數(shù)據(jù)是陸續(xù)傳輸?shù)模€是一次全部傳完呢?比如,如果你要?jiǎng)?chuàng)建的應(yīng)用程序在某些任務(wù)完成時(shí)會(huì)告知具體的計(jì)算機(jī),那么選擇UDP協(xié)議會(huì)更合適一些。UDP協(xié)議也更適合于發(fā)送小量數(shù)據(jù)。
協(xié)議的配置
配置你的應(yīng)用程序所用到的協(xié)議:在設(shè)計(jì)階段,單擊工具窗口里的協(xié)議,選擇
sckTCPProtocol或sckUDPProtocol。你也可以在代碼里配置協(xié)議,就像下面這樣:
Winsock1.Protocol=sckTCPProtocol
確定你的計(jì)算機(jī)名
要連接到遠(yuǎn)程的計(jì)算機(jī),你必須知道它的IP地址或別名。IP地址是一串用句點(diǎn)分隔的3位數(shù)字。通常,計(jì)算機(jī)的別名更容易讓人記住。
按下面的步驟可以找到你的計(jì)算機(jī)名:
·在“任務(wù)欄”里單擊“開(kāi)始”
·在“設(shè)置”選項(xiàng)里單擊“控制面板”;
·雙擊“網(wǎng)絡(luò)”圖標(biāo);
·單擊“網(wǎng)絡(luò)標(biāo)識(shí)”
在“計(jì)算機(jī)名”中顯示的就是你的計(jì)算機(jī)名。
一旦你找到你的計(jì)算名,它就可以作為遠(yuǎn)程主機(jī)的屬性來(lái)用了。
TCP連接入門
當(dāng)用TCP控件創(chuàng)建應(yīng)用程序的時(shí)候,必須首先明確你的程序是作為服務(wù)端還是客戶端。創(chuàng)建服務(wù)端程序就意味著你的程序能夠在指定的端口進(jìn)行“監(jiān)聽(tīng)”,而客戶端則能夠提出請(qǐng)求,服務(wù)端能夠接受請(qǐng)求并實(shí)現(xiàn)連接。一旦連接建立起來(lái),客戶端和服務(wù)端就能夠自由地進(jìn)行通信。
創(chuàng)建服務(wù)端程序
下面是創(chuàng)建一個(gè)簡(jiǎn)單服務(wù)端程序的步驟:
·創(chuàng)建一個(gè)標(biāo)準(zhǔn)EXE工程;
·把默認(rèn)窗體(Default form)的名字改為frmServer;
·把form的標(biāo)題(caption)改為TCP Server;
·把Winsock控件拉到窗體中,并命名為tcpServer;
在窗體中添加2個(gè)文本框,分別命名為txtSendData和txtOutput
’在窗體中加入下列代碼;
Private Sub Form_Load()
’ Set the LocalPort property to an integer.
’ Then invoke the Listen method.
tcpServer.LocalPort = 1001
tcpServer.Listen
frmClient.Show ’ Show the client form.
End Sub
Private Sub tcpServer_ConnectionRequest _
(ByVal requestID As Long)
’ Check if the control’s State is closed. If not,
’ close the connection before accepting the new
’ connection.
If tcpServer.State <> sckClosed Then _
tcpServer.Close
’ Accept the request with the requestID
’ parameter.
tcpServer.Accept requestID
End Sub
Private Sub txtSendData_Change()
’ The TextBox control named txtSendData
’ contains the data to be sent. Whenever the user
’ types into the textbox, the string is sent
’ using the SendData method.
tcpServer.SendData txtSendData.Text
End Sub
Private Sub tcpServer_DataArrival _
(ByVal bytesTotal As Long)
’ Declare a variable for the incoming data.
’ Invoke the GetData method and set the Text
’ property of a TextBox named txtOutput to
’ the data.
Dim strData As String
tcpServer.GetData strData
txtOutput.Text = strData
End Sub
上面就是創(chuàng)建一個(gè)簡(jiǎn)單的服務(wù)端應(yīng)用程序的過(guò)程。然而,要完成整個(gè)過(guò)程,你還得創(chuàng)建一個(gè)客戶端程序。
創(chuàng)建TCP客戶端程序
·在工程中添加一個(gè)新的窗體(form),并命名為frmClient;
·將窗體的標(biāo)題(caption)改為TCP Client;
·添加一個(gè)Windsock控件到窗體中,命名為tcpCllient;
·添加2個(gè)文本框控件到frmClient窗體,分別命名為txtSend和txtOutput;
·添加一個(gè)按鈕控件(CommandButton)到窗體,命名為cmdConnecti;
·將按鈕控件標(biāo)題(caption)改為Connect;
在窗體中添加下面代碼:
注:確保將遠(yuǎn)程主機(jī)屬性(RemoteHost property)改為你的計(jì)算機(jī)別名。
Private Sub Form_Load()
’ The name of the Winsock control is tcpClient.
’ Note: to specify a remote host, you can use
’ either the IP address (ex: "121.111.1.1") or
’ the computer’s "friendly" name, as shown here.
tcpClient.RemoteHost = "RemoteComputerName"
tcpClient.RemotePort = 1001
End Sub
Private Sub cmdConnect_Click()
’ Invoke the Connect method to initiate a
’ connection.
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)建一個(gè)簡(jiǎn)單的客/服應(yīng)用程序。要試著讓兩者建立連接,可以運(yùn)行工程,單擊Connect。在任意一個(gè)txtSendData文本框中輸入文本,同樣的文本信息就會(huì)出現(xiàn)在另一個(gè)窗體的txtOutput文本框中出現(xiàn)。
可能的用途
·創(chuàng)建客戶端應(yīng)用程序,它能在信息到達(dá)中央服務(wù)器之前把用戶的信息收集起來(lái)。
·創(chuàng)建服務(wù)端應(yīng)用程序,它能作為來(lái)自多個(gè)用戶的數(shù)據(jù)一個(gè)集中處理點(diǎn)。
·創(chuàng)建“聊天”程序。
協(xié)議的選擇
當(dāng)我們使用WinSock控件時(shí),首先要確定的是使用TCP還是UDP協(xié)議。它們之間主要的區(qū)別在于連接狀態(tài):
TCP協(xié)議控件是一個(gè)基于連接的協(xié)議,就像電話機(jī)一樣,用戶必須在通話之前建立連接;
UDP是一個(gè)無(wú)連接的協(xié)議,兩臺(tái)計(jì)算機(jī)之間的事務(wù)處理就像傳紙條一樣:一臺(tái)計(jì)算機(jī)向另一臺(tái)計(jì)算機(jī)發(fā)送消息,但是它們之間并沒(méi)有一個(gè)明確的連接路徑。另外,發(fā)送的單個(gè)信息量的大小取決于網(wǎng)絡(luò)。
通常,你要?jiǎng)?chuàng)建的應(yīng)用程序的類別就決定了你要選擇的協(xié)議。以下是幾個(gè)能夠幫助你選擇合適的協(xié)議的問(wèn)題:
當(dāng)發(fā)送或接收數(shù)據(jù)時(shí),該應(yīng)用程序需要從服務(wù)端或客戶端獲得認(rèn)證嗎?如果要的話,那么TCP協(xié)議就正好需要在發(fā)送或接受數(shù)據(jù)前建立明確的連接。
要發(fā)送的數(shù)據(jù)量大嗎?(就像圖片、聲音文件之類)一旦建立了連接,TCP協(xié)議就會(huì)保持連接并保證數(shù)據(jù)的完整性。但是,這種連接會(huì)占用的更多的處理器資源,成本也會(huì)更高一些。
數(shù)據(jù)是陸續(xù)傳輸?shù)模€是一次全部傳完呢?比如,如果你要?jiǎng)?chuàng)建的應(yīng)用程序在某些任務(wù)完成時(shí)會(huì)告知具體的計(jì)算機(jī),那么選擇UDP協(xié)議會(huì)更合適一些。UDP協(xié)議也更適合于發(fā)送小量數(shù)據(jù)。
協(xié)議的配置
配置你的應(yīng)用程序所用到的協(xié)議:在設(shè)計(jì)階段,單擊工具窗口里的協(xié)議,選擇
sckTCPProtocol或sckUDPProtocol。你也可以在代碼里配置協(xié)議,就像下面這樣:
Winsock1.Protocol=sckTCPProtocol
確定你的計(jì)算機(jī)名
要連接到遠(yuǎn)程的計(jì)算機(jī),你必須知道它的IP地址或別名。IP地址是一串用句點(diǎn)分隔的3位數(shù)字。通常,計(jì)算機(jī)的別名更容易讓人記住。
按下面的步驟可以找到你的計(jì)算機(jī)名:
·在“任務(wù)欄”里單擊“開(kāi)始”
·在“設(shè)置”選項(xiàng)里單擊“控制面板”;
·雙擊“網(wǎng)絡(luò)”圖標(biāo);
·單擊“網(wǎng)絡(luò)標(biāo)識(shí)”
在“計(jì)算機(jī)名”中顯示的就是你的計(jì)算機(jī)名。
一旦你找到你的計(jì)算名,它就可以作為遠(yuǎn)程主機(jī)的屬性來(lái)用了。
TCP連接入門
當(dāng)用TCP控件創(chuàng)建應(yīng)用程序的時(shí)候,必須首先明確你的程序是作為服務(wù)端還是客戶端。創(chuàng)建服務(wù)端程序就意味著你的程序能夠在指定的端口進(jìn)行“監(jiān)聽(tīng)”,而客戶端則能夠提出請(qǐng)求,服務(wù)端能夠接受請(qǐng)求并實(shí)現(xiàn)連接。一旦連接建立起來(lái),客戶端和服務(wù)端就能夠自由地進(jìn)行通信。
創(chuàng)建服務(wù)端程序
下面是創(chuàng)建一個(gè)簡(jiǎn)單服務(wù)端程序的步驟:
·創(chuàng)建一個(gè)標(biāo)準(zhǔn)EXE工程;
·把默認(rèn)窗體(Default form)的名字改為frmServer;
·把form的標(biāo)題(caption)改為TCP Server;
·把Winsock控件拉到窗體中,并命名為tcpServer;
在窗體中添加2個(gè)文本框,分別命名為txtSendData和txtOutput
’在窗體中加入下列代碼;
Private Sub Form_Load()
’ Set the LocalPort property to an integer.
’ Then invoke the Listen method.
tcpServer.LocalPort = 1001
tcpServer.Listen
frmClient.Show ’ Show the client form.
End Sub
Private Sub tcpServer_ConnectionRequest _
(ByVal requestID As Long)
’ Check if the control’s State is closed. If not,
’ close the connection before accepting the new
’ connection.
If tcpServer.State <> sckClosed Then _
tcpServer.Close
’ Accept the request with the requestID
’ parameter.
tcpServer.Accept requestID
End Sub
Private Sub txtSendData_Change()
’ The TextBox control named txtSendData
’ contains the data to be sent. Whenever the user
’ types into the textbox, the string is sent
’ using the SendData method.
tcpServer.SendData txtSendData.Text
End Sub
Private Sub tcpServer_DataArrival _
(ByVal bytesTotal As Long)
’ Declare a variable for the incoming data.
’ Invoke the GetData method and set the Text
’ property of a TextBox named txtOutput to
’ the data.
Dim strData As String
tcpServer.GetData strData
txtOutput.Text = strData
End Sub
上面就是創(chuàng)建一個(gè)簡(jiǎn)單的服務(wù)端應(yīng)用程序的過(guò)程。然而,要完成整個(gè)過(guò)程,你還得創(chuàng)建一個(gè)客戶端程序。
創(chuàng)建TCP客戶端程序
·在工程中添加一個(gè)新的窗體(form),并命名為frmClient;
·將窗體的標(biāo)題(caption)改為TCP Client;
·添加一個(gè)Windsock控件到窗體中,命名為tcpCllient;
·添加2個(gè)文本框控件到frmClient窗體,分別命名為txtSend和txtOutput;
·添加一個(gè)按鈕控件(CommandButton)到窗體,命名為cmdConnecti;
·將按鈕控件標(biāo)題(caption)改為Connect;
在窗體中添加下面代碼:
注:確保將遠(yuǎn)程主機(jī)屬性(RemoteHost property)改為你的計(jì)算機(jī)別名。
Private Sub Form_Load()
’ The name of the Winsock control is tcpClient.
’ Note: to specify a remote host, you can use
’ either the IP address (ex: "121.111.1.1") or
’ the computer’s "friendly" name, as shown here.
tcpClient.RemoteHost = "RemoteComputerName"
tcpClient.RemotePort = 1001
End Sub
Private Sub cmdConnect_Click()
’ Invoke the Connect method to initiate a
’ connection.
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)建一個(gè)簡(jiǎn)單的客/服應(yīng)用程序。要試著讓兩者建立連接,可以運(yùn)行工程,單擊Connect。在任意一個(gè)txtSendData文本框中輸入文本,同樣的文本信息就會(huì)出現(xiàn)在另一個(gè)窗體的txtOutput文本框中出現(xiàn)。