WinSock控制項的使用(翻譯原創)

來源:互聯網
上載者:User

WinSock控制項能夠通過UDP協議(使用者資料包通訊協定)或TCP協議(資料轉送協議)串連到遠端機器並進行資料交換。這兩種協議都能用來建立用戶端和服務端應用程式。就像定時器控制項一樣,WinSock控制項運行時沒有一個可視的介面。
可能的用途
    建立用戶端應用程式,它能在資訊到達中央伺服器之前把使用者的資訊收集起來。
    建立服務端應用程式,它能作為來自多個使用者的資料一個集中處理點。
建立“聊天”程式。
協議的選擇
當我們使用WinSock控制項時,首先要確定的是使用TCP還是UDP協議。它們之間主要的區別在於串連狀態:
TCP協議控制項是一個基於串連的協議,就像電話機一樣,使用者必須在通話之前建立串連;
UDP是一個不需連線的協議,兩台電腦之間的交易處理就像傳紙條一樣:一台電腦向另一台電腦發送訊息,但是它們之間並沒有一個明確的串連路徑。另外,發送的單個資訊量的大小取決於網路。
通常,你要建立的應用程式的類別就決定了你要選擇的協議。以下是幾個能夠協助你選擇合適的協議的問題:
當發送或接收資料時,該應用程式需要從服務端或用戶端獲得認證嗎?如果要的話,那麼TCP協議就正好需要在發送或接受資料前建立明確的串連。
要發送的資料量大嗎?(就像圖片、音效檔之類)一旦建立了串連,TCP協議就會保持串連並保證資料的完整性。但是,這種串連會佔用的更多的處理器資源,成本也會更高一些。
資料是陸續傳輸的,還是一次全部傳完呢?比如,如果你要建立的應用程式在某些任務完成時會告知具體的電腦,那麼選擇UDP協議會更合適一些。UDP協議也更適合於發送小量資料。
協議的配置
配置你的應用程式所用到的協議:在設計階段,單擊工具視窗裡的協議,選擇
sckTCPProtocol或sckUDPProtocol。你也可以在代碼裡配置協議,就像下面這樣:
Winsock1.Protocol=sckTCPProtocol
確定你的電腦名稱
要串連到遠端電腦,你必須知道它的IP地址或別名。IP地址是一串用句點分隔的3位元字。通常,電腦的別名更容易讓人記住。
按下面的步驟可以找到你的電腦名稱:
在“工作列”裡單擊“開始”
在“設定”選項裡單擊“控制台”;
雙擊“網路”表徵圖;
單擊“網路標識”
在“電腦名稱”中顯示的就是你的電腦名稱。
一旦你找到你的計算名,它就可以作為遠程主機的屬性來用了。
TCP串連入門
當用TCP控制項建立應用程式的時候,必須首先明確你的程式是作為服務端還是用戶端。建立服務端程式就意味著你的程式能夠在指定的連接埠進行“監聽”,而用戶端則能夠提出請求,服務端能夠接受請求並實現串連。一旦串連建立起來,用戶端和服務端就能夠自由地進行通訊。
建立服務端程式
下面是建立一個簡單服務端程式的步驟:
建立一個標準EXE工程;
把預設表單(Default form)的名字改為frmServer;
把form的標題(caption)改為TCP Server;
把Winsock控制項拉到表單中,並命名為tcpServer;
在表單中添加2個文字框,分別命名為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

上面就是建立一個簡單的服務端應用程式的過程。然而,要完成整個過程,你還得建立一個用戶端程式。

建立TCP用戶端程式
在工程中添加一個新的表單(form),並命名為frmClient;
將表單的標題(caption)改為TCP Client;
添加一個Windsock控制項到表單中,命名為tcpCllient;
添加2個文字框控制項到frmClient表單,分別命名為txtSend和txtOutput;
添加一個按鈕控制項(CommandButton)到表單,命名為cmdConnecti;
將按鈕控制項標題(caption)改為Connect;
在表單中添加下面代碼:
註:確保將遠程主機屬性(RemoteHost  property)改為你的電腦別名。
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
以上代碼就能建立一個簡單的客/服應用程式。要試著讓兩者建立串連,可以運行工程,單擊Connect。在任意一個txtSendData文字框中輸入文本,同樣的文本資訊就會出現在另一個表單的txtOutput文字框中出現。

接受多個串連請求
上面介紹的服務端程式智能接受一個串連請求。但是,通過建立一組控制項,並使用同樣的控制項來接受多個串連請求也是可能的。在這種情況下,你不需要關閉串連,只要建立新的控制項執行個體(通過配置它的索引屬性),調用新的執行個體中的接受方法。
下面的代碼中,假定在一個叫sckServer的表單中有一個Winsock控制項,它的索引屬性設定為0。這樣這個控制項就是控制項數組的一部分。在聲明段中,生命一個模組層級變數intMax。在表單的載入事件中,intMax被設定為0,數組中第一個控制項的本地連接埠屬性被設定為1001。
監聽方法在控制項中被調用,它被作為“監聽控制項”。每個串連請求到來時,代碼會測試看它的索引(Index)是否為0(監聽控制項的值),如果是0,監聽控制項中intMax值增1,並用這個值建立新的控制項執行個體。新的控制項執行個體被用來接受串連請求。
Private intMax As Long

Private Sub Form_Load()
   intMax = 0
   sckServer(0).LocalPort = 1001
   sckServer(0).Listen
End Sub

Private Sub sckServer_ConnectionRequest _
(Index As Integer, ByVal requestID As Long)
   If Index = 0 Then
      intMax = intMax + 1
      Load sckServer(intMax)
      sckServer(intMax).LocalPort = 0
      sckServer(intMax).Accept requestID
      Load txtData(intMax)
   End If
End Sub

UDP串連入門
建立一個UDP應用程式比建立TCP程式更簡單,因為UDP協議不需要一個確定的串連。在上面的TCP應用程式中,其中一個Winsock控制項必須明確的被設定為“監聽”,而另一個必須用串連方法發起串連。
相反,UDP協議不需要明確的串連。要在2個控制項之間傳送資料,(串連的雙方)必須完成三個步驟:
確定遠程主機屬性為對方的電腦名稱;
確定遠程主機屬性為第二個控制項的本地連接埠屬性;
呼叫慣例方法指定要被使用的本地連接埠。(下面將詳細討論該方法)
建立一個的UDP串連端
建立一個標準EXE工程;
將預設表單命名為frmPeerA;
在表單中添加一個Winsock控制項,命名為udpPeerA;
在屬性(Properties)頁,單擊協議(Protocol),改為UDPProtocol;
添加2個文字框控制項表單中,分別命名為txtSend和txtOutput;
在表單中添加下面代碼:
Private Sub Form_Load()
    ' The control's name is udpPeerA
    With udpPeerA
        ' IMPORTANT: be sure to change the RemoteHost
        ' value to the name of your computer.
        .RemoteHost= "PeerB"
        .RemotePort = 1001   ' Port to connect to.
        .Bind 1002                ' Bind to the local port.
    End With
    frmPeerB.Show                 ' Show the second form.
End Sub

Private Sub txtSend_Change()
    ' Send text as soon as it's typed.
    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

建立第二個UDP串連端
添加標準表單到工程中;
將表單名改為frmPeerB;
將表單標題改為Peer B;
在表單中添加一個Windsock控制項並命名為udpPeerB;
在屬性頁面中單擊Protocol,改為UDPProtocol;
添加2個文字框到表單中,分別命名為txtSend和txtOutput;
在表單中添加下面代碼:
Private Sub Form_Load()
    ' The control's name is udpPeerB.
    With udpPeerB
        ' IMPORTANT: be sure to change the RemoteHost
        ' value to the name of your computer.
        .RemoteHost= "PeerA"
        .RemotePort = 1002    ' Port to connect to.
        .Bind 1001                ' Bind to the local port.
    End With
End Sub

Private Sub txtSend_Change()
    ' Send text as soon as it's typed.
    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

 關於約定方法
上面代碼中所涉及的,在建立UDP應用程式時必須呼叫慣例方法。這個約定的方法保留了控制項用到的本地連接埠。例如,當你繫結控制項到連接埠1001時,其他的應用程式都不能用該連接埠監聽。當你希望阻止其他的應用程式使用某連接埠的時候,這個就很有用。
這個約定方法也引起了爭議。如果機器裡有多個網路介面卡,本地IP允許你指定用哪個適配器。如果你忽略了這個爭議性問題,控制項就會使用電腦控制台設定中,在網路控制台對話方塊裡列出的第一個網路介面卡。
在使用UDP協議時,你可以自由的切換遠程主機和遠程連接埠屬性,同時保留本地連接埠範圍。但是在使用UDP協議時,你必須在改變遠程主機和遠程連接埠屬性時關閉串連。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.