Internet, IP адрес, Socket. c#_Internet, IP адрес, Socket. Программирование для Интернет
Скачать 1.99 Mb.
|
Internet, IP адрес, SocketПреподаватель: Ратт Алексей ВасильевичПЕРМСКИЙ ГОСУДАРСТВЕННЫЙ НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ КАФЕДРА КОМПЬЮТЕРНЫХ СИСТЕМ И ТЕЛЕКОММУНИКАЦИЙ Программирование для Интернет (лекции) Литература Джефри Рихтер: CLR via C# Эндрю Троелсен: Язык программирования C# 5.0 и платформа .net 4.5 Откуда еще брать информацию Интернет https://msdn.microsoft.com/ru-ru/library/ https://docs.microsoft.com/ru-ru/dotnet https://stackoverflow.com/ https://www.google.com/ Internet vs WWW Internet WWW Voice IP Social media Games всемирная система объединённых компьютерных сетей для хранения, обработки и передачи информации распределённая система, предоставляющая доступ к связанным между собой документам, расположенным на различных компьютерах, подключённых к сети Интернет. Программа-Клиент и программа-сервер Хорошо, а что такое клиент и что такое сервер? Разница между клиентом и сервером заключается в том, кто отправляет запрос, и кто его обрабатывает и отвечает на него.
Опять же в обиходе одна и та же программа может быть в какой-то ситуации сервером, а в какой-то – клиентом. Толстые клиенты работают с информацией на основе собственных аппаратных и программных возможностей, в то же время тонкие применяют ПО центрального сервера только чтобы обработать данные, предоставляя системе лишь требуемый графический интерфейс для выполнения работы пользователем. Клиент-серверная архитектура (Client-server pattern)
Клиент и сервер могут находиться как на разных компьютерах, так и на одном. В рамках нашего курса связь между клиентом и сервером осуществляется по сети Интернет на основе (по правилам) протоколов стека TCP/IP. Vocabulary Client ['klaɪənt] – клиент Server ['sɜːvə] – сервер Request [rɪ'kwest] – запрос Response [rɪ'spɔn(t)s] – ответ В то же время приемлемо говорить: «Клиент отправил реквѐст, но сервер не вернул респòнс» Адресация в интернете Интернет – всемирная система объединенных компьютерных сетей для хранения и передачи информации. Построена на базе стека протоколов TCP/IP. Немного о правилах русского языка: Можно писать как Интернет, так и интернет. Слово интернет относится ко 2-му склонению. Поэтому наш курс, вообще говоря, назван не совсем корректно. Протоколы – это правила передачи данных между узлами компьютерной сети. Стек протоколов TCP/IP – это система (упорядоченный набор) протоколов для организации интернета. Адрес узла в интернете – это его IP адрес или имя. Устройства (компьютеры), связанные сетью, называются узлами или хостами. Порты Порты могут принимать значения от 0 до 216 – 1, т.е. от 0 до 65535. На одном компьютере может работать несколько программ, к которым нужно будет подключаться через интернет. Указав один лишь IP адрес, мы укажем, на какой узел в сети отправляется информация, но мы не идентифицируем программу, к которой обращаемся. Чтобы обеспечить доступность всех таких программ на одном узле, при адресации используются порты. Пример: в браузере вы набираете адрес хоста www.psu.ru без указания порта. Браузер по умолчанию пытается подключиться к веб-серверу, которые обычно принимают запросы через порт 80. Т.е. на самом деле браузер отправляет запрос на адрес www.psu.ru:80 Номера специфических портов регистрирует Internet Assigned Numbers Authority 0-1023 – системные (system) или общеизвестные (well-known) порты 1024-49151 – зарегистрированные (registered) или пользовательские порты 49152-65535 – динамические (dynamic) порты. На русском языке в wiki Клиент-Сервер, Порты Сервер:
Клиент: Сервер при запуске сообщает Операционной Системе, что хотел бы «занять» определенный порт (или несколько портов). После этого все пакеты, приходящие на компьютер к этому порту, ОС будет передавать этому серверу. Говорят, что сервер «слушает» этот порт. Клиент, начиная соединение, запрашивает у своей ОС какой-нибудь незанятый порт во временное пользование, и указывает его в посланных пакетах как порт источника. Затем на этот порт он получит ответные пакеты от сервера. Классы для адресов IPAddress ipFromByte = new IPAddress(new byte[] { 192, 168, 0, 1 }); IPAddress ipFromString = IPAddress.Parse("192.168.0.1"); IPAddress loopback = IPAddress.Loopback; // 127.0.0.1 IPAddress broadcast = IPAddress.Broadcast; // 255.255.255.255 IPAddress any = IPAddress.Any; // 0.0.0.0 IP адреса IP адрес + № порта = конечная точка (End Point) IPEndPoint ep = new IPEndPoint(ipFromByte, 8000); // 192.168.0.1:8000 Один компьютер может иметь несколько IP адресов в сети: IPHostEntry vk = Dns.GetHostEntry("vk.com"); Console.WriteLine(vk.HostName); foreach (IPAddress ip in vk.AddressList) Console.WriteLine(ip.ToString()); Получение адресов текущего компьютера string localHostName = Dns.GetHostName(); IPHostEntry host = Dns.GetHostEntry(localHostName); Сначала получим информация о текущем хосте в виде объекта IPHostEntry Дальше нужно выбрать адрес из нужного семейства адресов: IPAddress ip = null; foreach (var address in host.AddressList) if (address.AddressFamily == AddressFamily.InterNetwork) ip = address; if (ip == null) throw new Exception("Appropriate address not found"); Socket Сокет представляет одну сторону соединения между клиентом и сервером. Для установления соединения на обеих сторонах, у клиента и у сервера, должны существовать (быть открыты) свои сокеты. Мы будем различать следующие сокеты:
Датаграммный vs поточный сокеты
Потоковые сокеты по сравнению с дейтаграммными действительно дают более надежный метод, но для некоторых приложений накладные расходы, связанные с установкой явного соединения, неприемлемы (например, сервер времени суток, обеспечивающий синхронизацию времени для своих клиентов). В конце концов на установление надежного соединения с сервером требуется время, которое просто вносит задержки в обслуживание, и задача серверного приложения не выполняется. Для сокращения накладных расходов нужно использовать дейтаграммные сокеты. Передача данных по TCP Данные передаются порциями (chunks). Клиент (сервер) может отправить только одну строку «Hello world», а может отправить крупный видео-файл – все это chunks. Каждая такая порция – это определенный массив байтов. Для отправки по сети эти массивы дробятся на пакеты (packets). На другом конце данные собираются в потоки байтов. Части данных будут приходить неравномерно, через разные интервалы времени. Все они складываются в буфер, массив байт в памяти, чтобы программа на принимающем узле затем прочитала оттуда данные. Программа-отправитель передает в сокет массив байтов byte[] Транспортный уровень Перед передачей byte[] разбивается на пакеты согласно протоколу TCP На другой стороне по протоколу TCP пакеты собираются обратно в исходный byte[] На другом конце программа получает от сокета массив byte[] Сетевая модель OSI Модель OSI является эталонной, но не строгой. Ее цель заключается главным образом в том, чтобы помочь разработчику логически разделять разные уровни обработки информации.
Использование TCP сокета на клиенте Инициализация сокет Установка соединения Connect() Отправка запроса Send() Ожидание ответа Receive() IPAddress ip = new IPAddress(new byte[] { 127, 0, 0, 1 }); IPEndPoint ep = new IPEndPoint(ip, 8080); Socket socket = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Connect(ep); string message = "hello"; socket.Send(Encoding.Unicode.GetBytes(message)); byte[] buffer = new byte[1024]; socket.Receive(buffer); Console.WriteLine("Response from server: {0}", Encoding.Unicode.GetString(buffer)); socket.Close(); Закрытие сокета Использование TCP сокета на клиенте 2 Инициализация сокета Установка соединения Connect() Отправка/получение запроса в цикле Send()/Receive() Закрытие сокета Не обязательно сначала отправлять запрос и затем ожидать ответа: можно сразу начинать принимать информацию из сокета. С другой стороны, так же необязательно и читать ответы сервера: можно только отправлять информацию. В стандартном приложении клиент обычно отправляет запросы, и затем обрабатывает полученный ответ от сервера. Использование сокетов на сервере Инициализация сокета Привязка сокета к конечной точке Bind() Начало прослушивания (ожидания) входящих соединений Listen() Прием входящего соединения Accept() и создание сокета для этого подключения Отправка/получение запроса в цикле Send()/Receive() Закрытие сокета Работа с сокетами в .NET Поддержку сокетов в .NET обеспечивают классы в пространстве имен System.Net.Sockets
Класс Socket
Класс Socket - продолжение
Класс Socket - продолжение
Использование сокетов на сервере – пример кода IPAddress ip = new IPAddress(new byte[] { 192, 168, 0, 4 }); IPEndPoint ep = new IPEndPoint(ip, port); Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); listenSocket.Bind(ep); listenSocket.Listen(100); while (true) { Socket incomingCall = listenSocket.Accept(); StringBuilder builder = new StringBuilder(); int bytes = 0; // number of accepted bytes (see Receive) byte[] data = new byte[1024]; // buffer for incoming data bytes = incomingCall.Receive(data); Console.WriteLine(Encoding.Unicode.GetString(data, 0, bytes)); data = Encoding.Unicode.GetBytes("response"); incomingCall.Send(data); incomingCall.Shutdown(SocketShutdown.Both); incomingCall.Close(); } Что значит – 100 ? Сервер - пример кода 2 // Устанавливаем для сокета локальную конечную точку IPHostEntry ipHost = Dns.GetHostEntry("localhost"); IPAddress ipAddr = ipHost.AddressList[0]; IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 8000); Класс Dns предоставляет методы, возвращающие информацию о сетевых адресах, поддерживаемых устройством в локальной сети. Если у устройства локальной сети имеется более одного сетевого адреса, класс Dns возвращает информацию обо всех сетевых адресах, и приложение должно выбрать из массива подходящий адрес для обслуживания. пример кода 2 Перечисление AddressFamily указывает схемы адресации, которые экземпляр класса Socket может использовать для разрешения адреса. В параметре SocketType различаются сокеты TCP и UDP. В нем можно определить в том числе следующие значения: Raw (доступ к транспортному протоколу) или Stream - Поддерживает потоковые сокеты. Значение Stream требует указать Tcp для типа протокола. Третий параметр определяет тип протокола, требуемый для сокета. В параметре РrotocolType можно указать следующие наиболее важные значения - Tcp, Udp, Ip, Raw. // Создаем сокет Tcp/Ip Socket sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp); пример кода 2 Метод Bind() связывает сокет с локальной конечной точкой. Вызывать метод Bind() надо до любых попыток обращения к методам Listen() и Accept() В параметре Listen(10), указывающий максимальное число соединений, ожидающих обработки в очереди. В приведенном коде значение параметра допускает накопление в очереди до десяти соединений. Далее по схеме Accept() - согласие на соединение с клиентом while (true) { --- Socket handler = sListener.Accept(); Метод Accept() извлекает из очереди ожидающих запросов первый запрос на соединение и создает для его обработки новый сокет. Хотя новый сокет создан, первоначальный сокет продолжает слушать и может использоваться с многопоточной обработкой для приема нескольких запросов на соединение от клиентов. sListener.Bind(ipEndPoint); sListener.Listen(10); Эта же информация от Microsoft «прослушивание с помощью сокетов» пример кода 2 Как только клиент и сервер установили между собой соединение, можно отправлять и получать сообщения, используя методы Send() и Receive() класса Socket. Когда обмен данными между сервером и клиентом завершается, нужно закрыть соединение используя методы Shutdown() и Close(): handler.Shutdown(SocketShutdown.Both); handler.Close(); SocketShutdown — это перечисление, содержащее три значения для остановки: Both - останавливает отправку и получение данных сокетом, Receive - останавливает получение данных сокетом и Send - останавливает отправку данных сокетом. Клиент - пример кода 2 Все то же, что и в Sever. Единственный новый метод - метод Connect(), используется для соединения с удаленным сервером Стандартное взаимодействие клиента и сервера Socket Connect Send Receive Клиент Сервер Socket Bind Listen Accept, создание сокета входящего подключения Receive Обработка запроса Send Формирование виртуального канала, трубы для передачи данных Ответ (Response) Запрос (Request) |