WinSock | Клиент и Сервер

Сегодня мы познакомимся с 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

3. Раз кликаем на WinSock1 и добавляем его на форму.
Изменим у него свойство Name на tcpServer

tcpserver WinSock | Клиент и Сервер

4. Добавим на форму два TextBox'а и один Button

5. Вот что должно получиться(немного приукрасил)

tcpserver1 WinSock | Клиент и Сервер

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. Вот что должно получиться

tcpclient WinSock | Клиент и Сервер

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

Сохраняем клиент.

Запускаем сервер, а потом клиент.

В клиенте кликаем на кнопку "Подключиться", а потом вводим текст в первое текстовое поле и нажимаем на кнопку "Отправить", этот текст буден виден во втором текстовом поле в сервере.

Загрузить проект

  Метки:
  Евгений
  Просмотров: 18 954
  Запись опубликована в 18:55

20 комментариев

  • ммм у меня какиета ошибки в 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 нужен. Грузим страницу, выбираем элемент, присваиваем значение.

Есть что сказать? Тогда действуй!