WinSock | Клиент и Сервер
Сегодня мы познакомимся с
WinSock - это компонент через который можно соединяться с удаленной машиной и обмениваться с ней данными.
WinSock использует 2 протокола:
1) UDP (User Datagram Protocol)
2) TCP (Transmission Control Protocol).
Оба эти протокола используются для создания Клиент-Серверных приложений.
В этом уроке мы напишем программу клиент - сервер на Visual Basic.NET
Начнем.
Сначала создадим Сервер.
1. Создаем новый проект(Файл->Новый проект->Приложение Windows Form) или у кого версия английская (File->New Project->Application Windows Form)
2. Добавляем элемент WinSock.(смотрите видео кто не знает как добавить WinSock
4. Добавим на форму два TextBox'а и один Button
5. Вот что должно получиться(немного приукрасил)
6. Переходим к коду.
Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load tcpServer.RemoteHost = tcpServer.LocalIP ' RemoteHost должен соответствовать дружественному имени или IP-адресу вашего компьютера tcpServer.LocalPort = 2012 ' Задаем порт по которому будет происходить обмен данными tcpServer.Listen() ' Слушаем порт End Sub Private Sub tcpServer_ConnectionRequest(ByVal sender As Object, ByVal e As AxMSWinsockLib.DMSWinsockControlEvents_ConnectionRequestEvent) Handles tcpServer.ConnectionRequest If tcpServer.CtlState <> MSWinsockLib.StateConstants.sckConnected Then tcpServer.Close() ' Проверяет свойство CtlState, если старое соединие не закрыто, то закрываем его принудительно tcpServer.Accept(e.requestID) ' Принимаем запрос End Sub Private Sub tcpServer_DataArrival(ByVal sender As Object, ByVal e As AxMSWinsockLib.DMSWinsockControlEvents_DataArrivalEvent) Handles tcpServer.DataArrival tcpServer.GetData(TextBox2.Text) ' В TextBox2 мы будем получать сообщения от клиента End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click tcpServer.SendData(TextBox1.Text) ' Посылаем клиенту текст из TextBox1 End Sub End Class
7. С сервером мы закончили. Сохраняем его и создаем новый проект. Это будет у нас клиент.12. На форму добавляем WinSock , два TextBox и два Button13. У WinSock изменим свойство Name на tcpClient14. Вот что должно получиться
8. Переходим к коду.
Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load tcpClient.RemoteHost = tcpClient.LocalIP ' Будем коннектиться к серверу по тому же локальному айпи адресу tcpClient.RemotePort = 2012 ' Такой же порт как и в сервере End Sub Private Sub tcpClient_DataArrival(ByVal sender As Object, ByVal e As AxMSWinsockLib.DMSWinsockControlEvents_DataArrivalEvent) Handles tcpClient.DataArrival tcpClient.GetData(TextBox2.Text) ' В TextBox2 будем получать текст от сервера End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click tcpClient.Connect() ' Создаем соединение End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click tcpClient.SendData(TextBox1.Text) ' Отправляем текст серверу End Sub End Class
Сохраняем клиент.
Запускаем сервер, а потом клиент.
В клиенте кликаем на кнопку "Подключиться", а потом вводим текст в первое текстовое поле и нажимаем на кнопку "Отправить", этот текст буден виден во втором текстовом поле в сервере.
ммм у меня какиета ошибки в senddata в клиенте и в серваке
А почему у меня в visula baisic нету WinSock
Так я качал исходник и видео смотрел.
Но когда я открываю как навидео показано у меня там нету этого WinSock и всего 3 вкладки
на visual BAisic 2010
у вас нет на 2010 г WinSock?
Делал нету
Инструкция не до конца верная!
Во-первых этот винсокет не всегда есть на компе!
Ищите в инете MSWINSCK.OCX
Во-вторых функция GetData работает нормально только сервере, а на клиенте во втором аргументе нужно указывать тип возвращаемых данных, в данном случае это текст:
tcpClient.GetData(TextBox2.Text , vbString)
Но в этом случае капризный VB.net начинает ругаться .. На VB6 данный код сработал бы без проблем!
Вы явно что-то путаете.
"Ищите в инете MSWINSCK.OCX" - с таким расширением только для VB6 подходит. Для VB.NET нужен WinSock.dll
"tcpClient.GetData(TextBox2.Text , vbString)" - необязательно, да и ругаться он не будет, т.к TextBox уже в типе String.
Эт я чет натупил по поводу типа данных. Это совершенно не обязательно. А вот сам компонент у меня например не был установлен, я скачал MSWINSCK.ocx, положил его в систему и из VB.net добавил его как компонент.
Работает отлично! Спасибо.
Единственный вопрос.. будет ли это вне локальной сети работать?
Должно, сам не испытывал, а вот знакомый писал что-то типа чата.
В клиенте он писал свой внешний адрес(который не должен изменяться), к которому будет будет подключатся клиент.
Попробуйте в клиенте и в сервере указать.
tcpClient.RemoteHost = "Внешний айпи адресс"
И потом скинуть другу клиент и попробывать проверить.
у меня при запуске вылетает
Значит делаете, что-то не правильно.
Зачем вы используете разные ники? Я вижу ваш АЙПИ адрес.
Хочу сделать морской бой что бы через инэт играть - но как - вот бы такой примерчик выложили - было бы супер - и что бы была возможность загрузить проект т.к. чайникам без этого нет ходу
видео в статье не увеличивается приходится идти на youtube
Есть такое. Попробую решить данную загвоздку. На счет примера, хм, посмотрю.
Ребята кто хорошо разбирается в VB.net помогите решить задачу, надо загрузить данные в datagrid(парсить с сайта) с этим разобрался, потом одинаковые элементы в столбце должны мигать, потом данные этих ячеек должны быть отослалы на определенные компы в лок сети. кто может помочь отзовитесь плиз)
Перенёс код в VB6. Пришлось немного изменить. Но работает. Вопрос: если повторно нажать соединение на клиенте - вылетает ошибка. Как сообщить серверу, что клиент вышел и чтобы он сбросил соединение? При повторном запуске клиента(а сервер остался запущенным), при попытке соединиться, сервер молчит и ничего больше не принимает. Как сбросить соединение на сервере и чтобы он опять принимал от клиента соединение?
Старое удалять и создавать новое.
Вот сейчас заполняю вашу форму. Щас нажму кнопку "Оставить комментарий"
Вопрос: могу ли я через WinSock перехватить на VB6 данные из этой формы в какой-то файл или массив, неважно. Я так понимаю, что методами и Get и Post передаются имена (типы поле - вряд ли) и данные этих полей. Если возможно, мыльните на ras@dznn.ru. Мне нынче 62года, мозги скрипят, блин. А тут, на старости лет, появилась необходимость свой сайт слегка крутануть, кой-какие старые базы по ресурсам сохранились, вот и хочу что-то типа автозаполнителя форм построить. Спасибо.
Если я правильно понимаю, winsock не подходит для автозаполнения форм на сайтах, тут скорее какой-нибудь компонент типа webbrowser нужен. Грузим страницу, выбираем элемент, присваиваем значение.