Версия 1 – TcpListener

Практические занятия 18

ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

Какие бывают IP адреса?

Каждому компьютеру в TCP сети присваивается сетевой адрес, который в общем виде выглядит так х.х.х.х (10.0.0.6). Если компьютер имеет больше одной сетевой карты, тогда может быть больше одного адреса. Кроме того, есть еще два важных адреса: • 0.0.0.0 – если установить его, как исходный адрес, то программа будет прослушивать все сетевые карты компьютера.

• 127.0.0.1 – это локальный адрес. Любая программа которая привязывает себя к этому адресу, будет доступна только на этом же компьютере. Чтобы несколько программ могли использовать сетевой интерфейс, каждая может прослушивать один 16 битный порт (0 – 65536, 0 – 1024 обычно зарезервированы системными службами).

Для небольшого сервера можно выбрать порт 2200. Это возможно для программ которые привязывают себя только к одной сетевой карте (например, web сервер будет доступен только через внешний интерфейс) или все одновременно. Если использовать адрес 127.0.0.1, то «сервер» будет доступен программе только на этом же компьютере.

Задание 1

Цель: разработать проект для отправки сообщения с клиента на сервер и последующим выводом этого сообщения на экране сервера.

 

КЛИЕНТ

1. Создать консольный проект в IDE (visual studio).

2. Создать объект класса Socket, этот класс как раз и предоставляет все средства для сетевого взаимодействия в c#. Для его использования нужно подключить пространство [System.Net.Sockets].

 

 

Чтобы закончить создание объекта, нужно использовать один из его конструкторов. В этом примере мы будем работать с протоколом TCP, поэтому заполняем по следующим образом:

 

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

Создали сокет.

3. Дальше нам нужен какой-то массив байтов (буфер). В сетевом взаимодействии обмен информацией происходит в байтах. То есть в нашем случае нам нужно преобразовать строку в некую последовательность байтов и отправить её на сервер. Для начала создадим буфер, затем запросим у пользователя ввод строки, преобразуем её в байты и запишем в наш буфер:

 

 

4. Дальше нам нужно будет отправить наше сообщение. Для того чтобы это сделать, нам нужно подключиться к нашему серверу с помощью метода connect(). У него есть одна простая перегрузка, которая позволит сразу ввести в параметрах ip и порт нашего сервера. Т.к. будем подключаться к себе, то ip будет 127.0.0.1, а порт 666. Затем мы просто с помощью метода send() передаём в параметры наш буфер и отправляем байты на сервер, а так же закрываем подключение.

 

 

СЕРВЕР

Сервер должен принимать сообщение.

1. Для начала нам нужно сокет.

2. Дальше нужно привязать сервер к определённому ip. Делается это через метод Bind(). Мы не можем напрямую вписать IP и порт, надо создать объект класса IPEndPoint, который относится к пространству имён System.Net и в его конструкторе вписать IPAddress.Any (Позволяет использовать любой доступный IP на нашем компьютере) и порт, который мы указывали при создании клиента.
После, с помощью метода Listen(), ставим ограничение на максимальное количество входящих подключений, которое может обработать сервер. Тут будет число, подключений, которые могут быть поставлены в очередь сокета. Ну и нам нужно получать запросы от клиентов. Это делается через метод Accept().

 

3. Дальше нам нужно принимать информацию от клиента. Делаем это через метод Recive(). Нужно куда-то записывать эту информацию. Т.к. это поток байтов, то нам вновь нужен буфер, создадим его.

 

 

4. Декодируем наше сообщение и выводим его на экран сервера.


 



Задание 2

Создать маленький TCP-сервер который передает простое сообщение к каждому подсоединённому клиенту. Первые два примера используют синхронный ввод/вывод, последний использует асинхронное соединение. Каждая из следующих программ будет делать:

1. Настройка TCP стека

2. Прослушивание входящих TCP соединений (localhost, порт 2200)

3. Принятие соединения

4. Отображение IP адреса вызывающего, и порт удаленной системы

5. Посылка сообщения “Я немного занят, приходите попозже”

6. Закрытие соединения

7. Повторяем с пункта 2

1. Создать консольное приложение

Версия 1 – TcpListener

Чтобы избежать углубления в TCP стек, классы System.Net.Sockets.TcpClient и System.Net.Sockets.TcpListener помогут отправлять и принимать данные по сети. Также это возможно через объект NetworkStream.

· TcpListener позволит прослушивать входящие соединения

· TcpClient обрабатывать соединение

· NetworkStream посылать и принимать данные

 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 static void Main(string[] args) { ASCIIEncoding encoding = new ASCIIEncoding(); Byte[] message = encoding.GetBytes("Я немножко занят, приходите попозже");   try { IPAddress localAddress = IPAddress.Parse("127.0.0.1"); TcpListener listener = new TcpListener(localAddress,2200);   listener.Start(1);   while (true) { Console.WriteLine("Сервер ожидает {0}", listener.LocalEndpoint); TcpClient client = listener.AcceptTcpClient(); NetworkStream io = client.GetStream();   Console.WriteLine("Принято соединение от {0}", client.Client.RemoteEndPoint);   Console.WriteLine("Отправляем сообщение..."); io.Write(message,0,message.Length);   Console.WriteLine("Закрытие соединения"); client.Close(); } } catch (Exception e) { Console.WriteLine("Произошла ошибка {0}", e.Message); } }

 

Создали синхронное соединение –необходимо дождаться подключения чтобы программа смогла продолжить работу.

Запустите telnet (из командной строки) и подсоединитесь к серверу. Продолжим выполнение программы, как только подсоединимся.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: