Site hosted by Angelfire.com: Build your free website today!

Visual Basic Concepts

Использование Winsock Control

См.также

A WinSock control позволяет вам соединиться с удаленным компьютером и обмениваться данными, используя один и протоколов User Datagram Protocol (UDP) или Transmission Control Protocol (TCP). Оба протокола могут быть использованы для создания приложений клиента или сервера. Подобно Timer control, WinSock control не имеет видимого интерфейса во время выполнения.

Возможные применения

Selecting a Protocol

Когда используется WinSock control, в первую очередь решить использовать ли TCP или UDP protocol. Главное отличие между двумя положениями в состоянии их соединения:

Сущность приложения, которое вы создаете, в общих чертах будет определять какой протокол вам выбрать. Здесь несколько вопросов, которые могут помочь вам выбрать соответствующий протокол:

  1. Будет ли приложение требовать подтверждения от сервера или клиента, когда данные отправлены или получены? Если да, протокол TCP требует явного соединения перед отправкой или получением данных.

  2. Будет ли объем данных очень большим (как например, изображения или звуковые файлы)? Как только связь была установлена, TCP протокол поддерживает связь и гарантирует целостность данных.
    . Это соединение, однако, использует больше компьютерных ресурсов, становясь более "дорогим".

  3. Данные будут отправлены с перерывами или за один сеанс? Например, если вы создаете приложение, которое уведомляет указанные компьютеры когда определенная задача завершена, протокол UDP может быть более подходящим. Протокол UDP также более для отправки малого объема данных.

Установка протокола

Чтобы установить протокол, который будет использовать ваше приложение: во время проектирования, в окне Properties, щелкнуть Protocol и выбрать sckTCPProtocol, или sckUDPProtocol. Вы можете также установить свойство Protocol в коде, как показано ниже:

Winsock1.Protocol = sckTCPProtocol

Определение имени вашего компьютера

Для соединения с удаленным компьютером, вы должны знать его IP адрес или его имя. IP адрес - последовательность трех цифр, разделенная точкой(xxx.xxx.xxx.xxx). В общем, намного легче вспомнить имя компьютера.

Чтобы найти имя вашего компьютера:

  1. На Taskbar вашего компьютера, щелкнуть Start.

  2. На пункте Settings, щелкнуть Control Panel.

  3. Двойной щелчок на иконе Network.

  4. Щелкнуть Identification tab.

  5. Имя вашего компьютера найдете на панели Computer name.

Как только вы нашли имя вашего компьютера, оно может быть использовано как значение свойства RemoteHost.

Соединение, основанное на TCP

Когда создается приложение, использующее протокол TCP, вы должны решите, ваше приложение будет серверным или клиентским. Создавать серверное значит, что ваше приложение будет "прослушиваться" в порту назначения. Когда клиент делает запрос на соединение, сервер может принять запрос и таким образом осуществить соединение. Как только соединение осуществлено, клиент и сервер могут свободно связывться с другим.

Следующие шаги создают элементарный сервер:

Создать сервер TCP

  1. Создать новый стандартный проект EXE.
  2. Изменить имя формы по умолчанию на frmServer.
  3. Изменить свойство "Caption" формы на "TCP Server."
  4. Перетянуть Winsock control на форму и изменить его имя на tcpServer.
  5. Добавить два TextBox control на форму. Имя первого txtSendData, а второго txtOutput.
  6. Добавить нижеследующий код на форму.
    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
    
    7. Процедуры выше создают простое серверное приложение.Однако, чтобы выполнить сценарий, вы должны создать приложение клиента.

Чтобы создать клиент TCP

  1. Добавить новую форму на прект, и установить ее имя frmClient.
  2. Изменить свойство "Caption" формы на TCP Client.
  3. ДобавитьWinsock control на форму и установить имя его tcpClient.
  4. Добавить два TextBox control на frmClient. Имя первого txtSend, а второго txtOutput.
  5. Перетянуть CommandButton control на форму и установить его имя cmdConnect.
  6. Изменить свойство "Caption" CommandButton control на Connect.
  7. Добавить нижеследующий код к форме.

Важно  Гарантировать, что значение свойства RemoteHost изменено на имя вашего компьютера.

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 TextBox на одной из форм, и тот же текст будет виден в txtOutput TextBox на другой форме.

Прием более чем одного запроса на соединение

Элементарный сервер, набросанный выше, принимает только один запрос на соединение. Однако, возможен прием нескольких запоосов на соединение, используя тот же control, создав массив control. В таком случае вам не нужно закрывать соединение, а просто создать новый экземпляр (установив свойство Index), и выполнив метод Accept на новом экземпляре.

В коде приведенном ниже принято, что Winsock control на форме назван sckServer, и его свойство Index установлено в 0; тот control является частью массива control. В секции объявлений на уровне модуля объявлена переменная intMax. В событии Load формы, intMax установлена в 0, а свойство LocalPort для первого control в массиве устанавливается в 1001. Тогда метод Listen выполняется для control, делая его прослушиваемым control. Как только поступает запрос на соединение, код проверяет свойство Index на 0 (признак того, что control "прослушиваемый" ). Если да, прослушиваемый control увеличивает intMax, и использует тот номер, чтобы создать новый экземпляр control. Новый экземпляр control потом используется для приема запроса на соединение.

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 control должен быть явно установлен как "listen", тогда как другой должен инициировать соединение методом Connect.

В противоположность, протокол UDP не требует явного соединения. Чтобы отправить данные между двумя control, должны быть выполднены три шага(на обоих сторонах соединения):

  1. Установить свойство RemoteHost на имя другого компьютера.
  2. Установить свойство RemotePort на значение свойства LocalPort второго control.
  3. Выполнить метод Bind, указав используемый LocalPort. (Этот метод более детально обсуждается ниже.)

Поскольку оба компьютера могут быть равными в отношениях , приложение может быть объявлено как приложение peer-to-peer(любой компьютер может быть как клиентом так и сервером). Для демонстрации этого приведенный ниже код создает приложение "chat", которое позволяет каждому говорить с другим в режиме реального времени:

Создать UDP узел сети

  1. Создать новый стандартный проект EXE.
  2. Изменить имя формы по умолчанию на frmPeerA.
  3. Изменить свойство формы Caption на "Peer A."
  4. Перетянуть Winsock control на форму и указать имя udpPeerA.
  5. На панели Properties, щелкнуть Protocol и изменить протокол на UDPProtocol.
  6. Добавить два TextBox control на форму. Имя первого txtSend, а второго txtOutput.
  7. Добавить приведенный ниже код к форме.
    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 узел

  1. Добавить стандартную форму к проекту.
  2. Изменить имя формы на frmPeerB.
  3. Изменить свойство формы Caption на "Peer B."
  4. Перетянуть Winsock control и указать имя udpPeerB.
  5. На панели Properties, щелкнуть Protocol и изменить протокол на UDPProtocol.
  6. Добавить два TextBox control на форму. Имя первого TextBox txtSend, а второго txtOutput.
  7. Добавить приведенный ниже код к форме.
    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
    

Чтобы попробовать пример, нажмите F5 для выполнения проекта, и введите текст в txtSend TextBox на одной из форм. Этот текст будет показан в txtOutput TextBox на другой форме.

О методе Bind

Как показано в приведенном выше коде, вы должны выполнить метод Bind, когда создается приложение UDP. Метод Bind "резервирует" локальный порт для использования control' ом. Для примера, когда вы связываете control с портом 1001, никакое другое приложение не может использовать этот порт для "прослушивания". Это может стать полезным если вы желаете предотвратить использование того порта другим приложением.

Метод Bind также имеет второй необязательный параметр. Усли на компьютере представлен более чем один сетевой адаптер, аргумент LocalIP позволяет вам, какой адаптер используется. Если вы опустите этот аргумент,  control использует первый сетевой адаптер, указанный в диалоговом окне "Сетевое окружение" панели управления компьютера.

Когда используется протокол UDP, вы можете свободно переключать свойства RemoteHost и RemotePort   пока сохраняется привязка к тому же локальному порту LocalPort. Однако, с протоколом TCP, вы должны закрыть соединение перед изменением свойств RemoteHost и RemotePort.