WinSock Control позволит вам подключится к удаленной машине и обмениваться с ней информацией используя User Datagram Protocol (UDP) или Transmission Control Protocol (TCP). Оба протокола могут использоваться для создания как клиентского, так и серверного приложений. Как и Timer control, WinSock control не имеет видимого интерфейса в при выполнении программ.
Возможное Применение
Выбор протокола
При использовании WinSock control, сначала подумайте, какой из протоколов, TCP или UDP вы будете использовать. Главное различие между ними это состояние подключения:
Характер приложения, который вы будете создавать – главным образом определит тип протокола, который вы выберите. Здесь приведены несколько вопросов, которые помогут вам, определится с выбором подходящего протокола:
Настройки протокола
Установите протокол, который будет использовать ваше приложение: вы можете установить свойства протокола с помощью кода, который приведен ниже:
Winsock1.Protocol = sckTCPProtocol
Определение Имени Вашего Компьютера
Для подключении к удаленному компьютеру, вам нужно знать либо его IP адрес, либо его "дружественное имя (DNS имя)." IP адрес это серия из трех цифр разделенных точками (xxx.xxx.xxx.xxx). Но, в общем, гораздо проще запомнить дружественное имя (DNS имя) компьютера.
Найдите имя вашего компьютера
После того как вы определите имя компьютера, его можно использовать как значение в свойстве RemoteHost.
Основы TCP Подключения
Если создается приложение, использующее TCP протокол, для начала вы должны решить – ваше приложение будет сервером или клиентом. Создание сервера означает, то ваше приложение будет "слушать" назначенный порт. Если создается клиент, то он формирует запрос на подключение, сервер принимает этот запрос, таким образом, завершая подключение. При выполненном подключении, клиент и сервер могут беспрепятственно "общаться" друг с другом.
По следующим шагам создается простейший сервер:
Создание TCP сервера
1. Создайте новый Стандартный EXE проект.
2. Измените имя, которое по умолчанию frmServer.
3. Измените заголовок формы на "TCP Server."
4. Перенесите элемент управления Winsock на форму и измените его имя на tcpServer.
5. Добавьте на форму два элемента TextBox. Имя первого будет 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
Процедура, описанная выше создает простое серверное приложение. Тем ни менее, для выполнения этого сценария, вам так же необходимо создать клиентское приложение.
Создание TCP клиента
Важно: Убедитесь, что изменили свойство RemoteHost на дружественное имя(DNS имя) вашего компьютера.
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 txtSend_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 на другой форме.
Прием Более чем Одного Запроса на Подключение
Обычный сервер ограничен, принимать более одного запроса на подключение. Тем ни менее, есть возможность принять несколько запросов на подключение используя одинаковое управление для всех, посредством создания массива управления. В этом случае, вам не нужно закрывать подключения, а просто нужно создать новые экземпляры управления (назначая им свойство Index), и вызывая метод Accept для каждого нового экземпляра.
Код ниже описывает, элемент управления Winsock в форме под названием sckServer, и что его свойство Index было установлено равным 0; таким образом, элемент управления – это часть массива управления. В разделе Объявления переменных, объявлена переменная intMax. В событии формы Load, intMax устанавливается равным 0, и свойство LocalPort для первого элемента управления в массиве устанавливается равным 1001. Затем, когда элементом управления вызывается метод Listen, он переводит элемент управления в режим «прослушивания». Для каждого подключения требуется допуск, код проверяет, равен ли Index 0 (состояние "слушает" у элемента управления). Если это так, слушающий элемент управления увеличивает intMax и использует это число, чтобы создать новый экземпляр элемента управления. И затем новый элемент управления использует accept, чтобы принять запрос на подключение.
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) IfIndex = 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 должен быть установлен в режим "слушает" пока другой будет инициировать подключение через метод Connect.
Как противоположность, UDP протокол не требует явной установки подключения. Чтобы выполнить пересылку данных между двумя управляющими элементами, необходимо выполнить три шага (на обеих сторонах подключения):
Потому что оба компьютера могут рассматриваться, как "равные" по взаимоотношению, это так же можно назвать как приложение точка-точка. Это демонстрирует код, представленный ниже, он создает приложение «чат», которое позволит двум людям «общаться» друг с другом в реальном времени:
Создание UDP Узла
1. Создайте новый проект Standard EXE.
2. Измените имя формы на frmPeerA.
3. Измените заголовок формы на "Peer A."
4. Перенесите управляющий элемент Winsock на форму и назовите его udpPeerA.
5. В Properties страницы, нажмите Protocol и измените протокол на UDPProtocol.
6. Добавьте два элемента TextBox на форму. Имя первого будет 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. Измените заголовок формы на "Peer B."
4. Перенесите элемент управления Winsock на форму и назовите его udpPeerB.
5. В Properties страницы, нажмите Protocol и измените протокол на UDPProtocol.
6. Добавьте два элемента TextBox на форму. Имя первого будет 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 "резервирует" локальный порт, используемый в элементе управления. Например, когда вы связываете элемент управления с портом 1001, никакое другое приложение не сможет использовать этот порт для установки "прослушивания". Это может оказаться полезным, если хотите предотвратить использование этого порта другим приложением.
Метод Bind имеет в своих свойствах второй аргумент. Если на машине имеется более одного сетевого адаптера, аргумент LocalIPпозволит вам указать какой именно адаптер используется. Если вы пропустите этот аргумент, то элемент управления использует первый адаптер в диалоговом окне список Сетевых Подключений компьютера из Настроек Панели Управления.
Если используется протокол UDP, вы можете легко менять свойства RemoteHost и RemotePort до тех пор пока оставшиеся bounds(связи) будут иметь один и тот же LocalPort. В то время как в TCP протоколе, вам необходимо сначала закрыть соединение перед изменением свойств RemoteHost и RemotePort.