Visual Basic Concepts
A WinSock control позволяет вам соединиться с удаленным компьютером и обмениваться данными, используя один и протоколов User Datagram Protocol (UDP) или Transmission Control Protocol (TCP). Оба протокола могут быть использованы для создания приложений клиента или сервера. Подобно Timer control, WinSock control не имеет видимого интерфейса во время выполнения.
Когда используется WinSock control, в первую очередь решить использовать ли TCP или UDP protocol. Главное отличие между двумя положениями в состоянии их соединения:
Сущность приложения, которое вы создаете, в общих чертах будет определять какой протокол вам выбрать. Здесь несколько вопросов, которые могут помочь вам выбрать соответствующий протокол:
Чтобы установить протокол, который будет использовать ваше приложение: во время проектирования, в окне Properties, щелкнуть Protocol и выбрать sckTCPProtocol, или sckUDPProtocol. Вы можете также установить свойство Protocol в коде, как показано ниже:
Winsock1.Protocol = sckTCPProtocol
Для соединения с удаленным компьютером, вы должны знать его IP адрес или его имя. IP адрес - последовательность трех цифр, разделенная точкой(xxx.xxx.xxx.xxx). В общем, намного легче вспомнить имя компьютера.
Чтобы найти имя вашего компьютера:
Как только вы нашли имя вашего компьютера, оно может быть использовано как значение свойства RemoteHost.
Когда создается приложение, использующее протокол TCP, вы должны решите, ваше приложение будет серверным или клиентским. Создавать серверное значит, что ваше приложение будет "прослушиваться" в порту назначения. Когда клиент делает запрос на соединение, сервер может принять запрос и таким образом осуществить соединение. Как только соединение осуществлено, клиент и сервер могут свободно связывться с другим.
Следующие шаги создают элементарный сервер:
Создать сервер TCP
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
Важно Гарантировать, что значение свойства 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 даже проще чем создание приложения TCP потому что протокол UDP не требует явного соединения. В приложении TCP, приведенном выше, один Winsock control должен быть явно установлен как "listen", тогда как другой должен инициировать соединение методом Connect.
В противоположность, протокол UDP не требует явного соединения. Чтобы отправить данные между двумя control, должны быть выполднены три шага(на обоих сторонах соединения):
Поскольку оба компьютера могут быть равными в отношениях , приложение может быть объявлено как приложение peer-to-peer(любой компьютер может быть как клиентом так и сервером). Для демонстрации этого приведенный ниже код создает приложение "chat", которое позволяет каждому говорить с другим в режиме реального времени:
Создать UDP узел сети
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 узел
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, когда создается приложение UDP. Метод Bind "резервирует" локальный порт для использования control' ом. Для примера, когда вы связываете control с портом 1001, никакое другое приложение не может использовать этот порт для "прослушивания". Это может стать полезным если вы желаете предотвратить использование того порта другим приложением.
Метод Bind также имеет второй необязательный параметр. Усли на компьютере представлен более чем один сетевой адаптер, аргумент LocalIP позволяет вам, какой адаптер используется. Если вы опустите этот аргумент, control использует первый сетевой адаптер, указанный в диалоговом окне "Сетевое окружение" панели управления компьютера.
Когда используется протокол UDP, вы можете свободно переключать свойства RemoteHost и RemotePort пока сохраняется привязка к тому же локальному порту LocalPort. Однако, с протоколом TCP, вы должны закрыть соединение перед изменением свойств RemoteHost и RemotePort.