Разработка сетевого чата на языке Visual C# с использованием технологий Microsoft.NET

Обоснование выбора языка программирования и сетевого протокола. Создание программного продукта для общения пользователей в сети интернет и локальных сетях. Описание разработанных компонентов программы сервера и клиента. Выполнение созданного приложения.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 07.08.2018
Размер файла 374,5 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Федеральное агентство связи

Федеральное государственное бюджетное образовательное учреждение

высшего образования

«Поволжский государственный университет телекоммуникаций и информатики»

Факультет Информационных систем и технологий

Направление (специальность) Информатика и вычислительная техника

Кафедра Информационных систем и технологий

ВЫПУСКНАЯ КВАЛИФИКАЦИОННАЯ РАБОТА

Разработка сетевого чата на языке Visual C# с использованием технологий Microsoft.NET

Разработал

К.В. Третьяков

Самара 2017

Введение

Сегодня за окном XXI век - век информационных технологий. Которые, в свою очередь, развиваются настолько стремительно, что за ними сложно уследить. Ведь прогресс информации сделал огромный шаг вперёд за последние десять лет. Уже сегодня современная цивилизация не может представлять себя без этого чуда научной мысли. Не зря Дмитрий Анатольевич основал 27 января сего года Фонд развития информационных технологий. Так как наша страна может похвастаться серьёзными достижениями в этой области и поддержать то, на что способны российские разработчики. Радует, что государство поддерживает такое перспективное направление.

У современного человека есть средства для выхода во всемирную сеть, будь то персональный компьютер или планшет со смартфоном. Интернет стал неотъемлемой частью нашей жизни. Вы можете обучаться новому каждый день или же посещать развлекательные порталы. И тут возникает потребность общения. Обсудить то, что ты узнал или не понимаешь. Выговориться по тому или иному поводу. Но как же расстояние? В наше время - не проблема, информационные технологии способны решить и эту задачу, данный диплом посвящён разработке средств общения на не ограниченное расстояние и в реальном времени.

Всё выше сказанное определило актуальность темы работы - она состоит в необходимости разработки приложения сетевого чата для общения людей на расстояние в реальном времени. На данный момент есть множество чатов, мессенджеров, которые так или иначе связаны с системой быстрого обмена сообщениями. Требуется приложение основной деятельностью станет эффективное выполнение поставленных задач и минимальное потребление системных ресурсов, приветствуется упрощённость для неопытных пользователей персонального компьютера.

Целью дипломной работы является разработка приложения сетевого чата на языке Visual C#. Запросы общения в локальных сетях и интернет растут и на протяжение уже нескольких лет видна положительная тенденция в этой информационной сфере. Поэтому и было принято решение разработать приложение, которое было бы минималистично по функционалу и максимально быстро обрабатывало поступающую и выходящую информацию.

Для достижения цели дипломной работы необходимо решить следующие задачи

1. Провести анализ технической литературы, соответствующей теме разработки

2. Изучить основные характеристики локальной сети и сетей интернет.

3. Выбрать сетевой протокол для реализации процесса разработки

4. Выбрать оптимальные методы разработки

5. Разработать приложение

6. Произвести анализ разработанного приложения

Объектом исследования является процессы передачи информации, в данном случае текстовой, посредством сокетов и сетевого протокола.

Предметом исследования является процесс разработки сетевого чата на языке Visual C# с помощью технологий Microsoft.NET

Основным источником информации для написания дипломной работы послужили базовая учебная литература, статьи и обзоры в специализированных и периодических изданиях, посвящённых программированию и работы с сетями, справочная литература, другие актуальные источники информации, что описано в разделе использованных источников информации.

Цель и задачи написания работы определили её структуру, которая состоит из введения, трёх глав и заключения.

Во введение обосновывается актуальность работы, цель, задачи, объект и предмет исследования.

Первая глава раскрывает требования для разрабатываемого приложения.

Вторая глава посвящена теоретическому материалу. А также разработки приложения.

В третьей главе описывается интерфейс и работа с программой.

В заключении сделаны основные выводы и результаты по проделанной работе.

1. Исследование предметной области и инструменты, используемые в рамках конкретной работы

1.1 Обоснование выбора языка программирования

Для написания дипломной работы была выбрана интегральная среда разработки Microsoft Visual Studio Enterprise 2017 c поддержкой программной платформы.NET Framework, поскольку:

· Поддержка возможностей языка C#

· Популярная среди программистов в ОС Windows

· Имеются необходимые средства и инструменты для разработки любого приложения

· Создание эффективного кода

· Возможность использования готовых библиотек классов

Т.к. выбрана платформа NET Framework, то и языком будет Visual C#, поскольку:

· В среде.Net этот язык «родной» для создания приложений

· Объектная ориентированность

· Безопасность кода (в сравнение с С -подобными)

· Унификация лучшего из современных языков: C++, Java и другие

Для разработки данной работы было принято решение создать сервер и клиент для чата, который был реализован в Microsoft Visual Studio Enterprise 2017.

1.2 Описание инструмента разработки

Интегрированная среда разработки Microsoft Visual Studio Enterprise 2017 (VSE 2017) последняя версия выпуска популярной и повсеместно используемой среды разработки профессионального программного обеспечения (ПО) производства компании Microsoft.

Унифицируя в себе все положительные моменты предыдущих версий, данная обеспечивает возможность использования всех преимуществ технологии Microsoft.NET. В числе достоинств, можно отметить следующие моменты:

· Повышение продуктивности разработчиков - ИСР Microsoft Visual Studio Enterprise 2017 традиционно продолжает путь развития корпорации Microsoft в области эффективных инструментальных средств для разработчиков сложного программного обеспечения. Тем самым обеспечивается среда разработки для всех языков программирования, в среде имеется набор окон с интуитивно понятным интерфейсом, полноценной справкой, IntelliTest (автоматическое создание модульных тестов для кода) и автоматическим выполнением всесторонних задач разработки. Visual Studio Enterprise 2017 имеет возможность в короткие сроки проводить профессиональную разработку программ различного уровня и назначения. Авторы продолжают заботиться о повышение продуктивности разработчиков. Создаются все условия, которые позволяют обратить всё внимание только на написание кода. К примеру, улучшения возможностей в навигации кода, рефакторинга, автоматических исправлений и отладки для всех поддерживаемых языков. Новая версия позволяет быстрее выполнять командную разработку проверки тестирования и новыми real-time функциями модульного тестирования.

· Процесс установки инструмента - Новый, облегчённый модульный тип позволяет установить только те компоненты среды, которые нужны вам. Что позволяет ускорить установку от начала и до конца. Теперь имеется возможность не создавать новый проект или решение, для того, чтобы отладить фрагмент кода.

· Поддержка множества языков программирования - Большие, профессиональные группы разработчиков всегда используют несколько языков программирования. Для удовлетворения этих потребностей в Visual Studio Enterprise 2017 авторы обеспечили возможность использования сразу нескольких языков в рамках одной и той же среды. Это благодаря внедрения общего конструктора для компонентов, для формата XML и HTML, а также единый отладчик программы, VSE 2017 предоставляет разработчикам эффективные средства, независимые от языка программирования. Разработчикам программного обеспечения при использовании VSE 2017 нет нужды ограничивать себя лишь одним языком программирования, адаптируя свою работу к особенностям этого языка. Более того, Visual Studio 2017 разрешает программисту использование уже имеющихся у него наработок, а также навыков разработчика, создающего свои программы на различных языках программирования.

· Отсутствие невоспроизводимых ошибок - Одна из главных проблем разработки заключается в то, что код работает на ПК (персональный компьютер), но не работает в тестовой или рабочей среде. И поиск этих ошибок занимает много времени - Просматривание исходного кода, сравнение среды и добавление точек останова. Тут и помогают инструменты диагностики Visual Studio Enterprise 2017, такие как IntelliTrace, вы имеете возможность просмотреть журнал выполнения кода в различных средах и переходить к проверенным данным сделанным в прошлом без задания точек останова вручную. Это избавит от уймы проблем и весьма сохранит ваше время, которые можно потратить более продуктивно.

· Единая модель программирования для всех типов приложений - Ранее, создаваемые приложения были зависимы от различных приёмов программирования, которые зависели от типа приложения - клиентское программное обеспечение, веб-приложения, программное обеспечение мобильных устройств и бизнес-логики промежуточного уровня имели различные значения между собой. Среда разработки Visual Studio Enterprise 2017 решает проблему, отдавая в распоряжение разработчика создание приложений единой моделью. Эта модель обладает простым и интуитивным интерфейсом, что позволяет разработчикам показать все свои навыки в создание всякого рода приложений.

· Поддержка жизненного цикла разработки - Среда Visual Studio Enterprise 2017 позволяет поддержать весь жизненный цикл разработки. Он начинается с планирования и проектирования, через разработку и тестирование и так до развёртывания и управление продуктом. Обеспечивается возможность подключения сторонних расширений для среды разработки независимых разработчиков. В Visual Studio Enterprise 2017 имеется адаптируемая среда для написания приложений и программ, так необходимых для современного мира.

1.3 Назначение разработанного приложения

Главной целью сетевого чата - является мгновенный обмен сообщениями. Такого рода приложения помогают сократить время выполнения работы или же провести время в общение с друзьями и знакомыми.

Сетевой чат имеет массу возможностей и областей применения. В домашних условиях, то есть в малом кругу лиц. Так и для дел, связанных с работой. Применяемо приложения как на предприятиях, так и для развлекательных целей.

Общий список разработки дипломного проекта:

? Сетевой чат обязан обеспечивать мгновенное отправление и получение сообщений, быть максимально полезным и потреблять наименьшие количество ресурсов компьютера;

? Разработанное приложение должно иметь наиболее простой интерфейс, не требующий специальной подготовки пользователя, должно быть более эффективное распределение экономии времени;

1.4 Требования к разработанному приложению

Разработать приложение чата в локальной сети и интернет. При разработке были учтены требования к полноценному сетевому чату. Эти требования имеют максимальное достижение удовлетворения потребностей пользователя.

Для работы приложения необходимо интернет или локальное соединение. Приложение должно представлять собой сервер и приложение-клиент, с которым работает пользователь.

Интерфейс программы должен быть максимально простым и способствовать снижению кол-ва ошибок, вызванные неправильными действиями пользователя.

Надёжность напрямую зависит от надёжности операционной системы. Необходимо проверять корректность входных и выходных данных. Запрещается подвергать какому-либо действию файлы программы.

1.5 Описание разработанного приложения

Приложение «Сетевой чат» есть сетевая программа, по этой причине она состоит из двух частей: программа-сервер и программа-клиент.

Программа сервер выполняет роль «кластера» между клиентами. Благодаря разработанному протоколу реализуется беседа в реальном времени, так же следит за состоянием клиентов. Приложение устанавливается на головной компьютер локальной сети, если общение происходит в её рамках, или же на доступном ресурсе в интернете.

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

К серверу подключается клиент. В свою очередь, в чате и сервере выводится сообщение о подключение собеседник. Новый клиент может писать и читать сообщения только с момента подключения. При отключении происходит вывод сообщения об отключение собеседника.

Для соединения сервера и клиента используется протокол TCP, так как необходимо надёжное соединение, чтобы быть уверенным, что сообщение дойдёт до получателя.

2. Основные принципы работы приложения

2.1 Сокет

Сокет -- это один конец двустороннего канала связи между двумя программами, работающими в сети. Соединяя вместе два сокета, можно передавать данные между разными процессами (локальными или удаленными). Реализация сокетов обеспечивает инкапсуляцию протоколов сетевого и транспортного уровней.

Первоначально сокеты были разработаны для UNIX в Калифорнийском университете в Беркли. В UNIX обеспечивающий связь метод ввода-вывода следует алгоритму open/read/write/close. Прежде чем ресурс использовать, его нужно открыть, задав соответствующие разрешения и другие параметры. Как только ресурс открыт, из него можно считывать или в него записывать данные. После использования ресурса пользователь должен вызывать метод Close(), чтобы подать сигнал операционной системе о завершении его работы с этим ресурсом.

Когда в операционную систему UNIX были добавлены средства межпроцессного взаимодействия (Inter-Process Communication, IPC) и сетевого обмена, был заимствован привычный шаблон ввода-вывода. Все ресурсы, открытые для связи, в UNIX и Windows идентифицируются дескрипторами. Эти дескрипторы, или описатели (handles), могут указывать на файл, память или какой-либо другой канал связи, а фактически указывают на внутреннюю структуру данных, используемую операционной системой. Сокет, будучи таким же ресурсом, тоже представляется дескриптором. Следовательно, для сокетов жизнь дескриптора можно разделить на три фазы: открыть (создать) сокет, получить из сокета или отправить сокету и в конце концов закрыть сокет.

Интерфейс IPC для взаимодействия между разными процессами построен поверх методов ввода-вывода. Они облегчают для сокетов отправку и получение данных. Каждый целевой объект задается адресом сокета, следовательно, этот адрес можно указать в клиенте, чтобы установить соединение с целью.

2.1.1 Типы сокетов

Существуют два основных типа сокетов -- потоковые сокеты и дейтаграммные.

- Потоковые сокеты (stream socket)

Потоковый сокет -- это сокет с установленным соединением, состоящий из потока байтов, который может быть двунаправленным, т, е. через эту конечную точку приложение может и передавать, и получать данные.

Потоковый сокет гарантирует исправление ошибок, обрабатывает доставку и сохраняет последовательность данных. На него можно положиться в доставке упорядоченных, сдублированных данных. Потоковый сокет также подходит для передачи больших объемов данных, поскольку накладные расходы, связанные с установлением отдельного соединения для каждого отправляемого сообщения, может оказаться неприемлемым для небольших объемов данных. Потоковые сокеты достигают этого уровня качества за счет использования протокола Transmission Control Protocol (TCP). TCP обеспечивает поступление данных на другую сторону в нужной последовательности и без ошибок.

Для этого типа сокетов путь формируется до начала передачи сообщений. Тем самым гарантируется, что обе участвующие во взаимодействии стороны принимают и отвечают. Если приложение отправляет получателю два сообщения, то гарантируется, что эти сообщения будут получены в той же последовательности.

Однако, отдельные сообщения могут дробиться на пакеты, и способа определить границы записей не существует. При использовании TCP этот протокол берет на себя разбиение передаваемых данных на пакеты соответствующего размера, отправку их в сеть и сборку их на другой стороне. Приложение знает только, что оно отправляет на уровень TCP определенное число байтов и другая сторона получает эти байты. В свою очередь TCP эффективно разбивает эти данные на пакеты подходящего размера, получает эти пакеты на другой стороне, выделяет из них данные и объединяет их вместе.

Потоки базируются на явных соединениях: сокет А запрашивает соединение с сокетом В, а сокет В либо соглашается с запросом на установление соединения, либо отвергает его.

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

Сервер электронной почты представляет пример приложения, которое должно доставлять содержание в правильном порядке, без дублирования и пропусков. Потоковый сокет рассчитывает, что TCP обеспечит доставку сообщений по их назначениям.

- Дейтаграммные сокеты (datagram socket)

Дейтаграммные сокеты иногда называют сокетами без организации соединений, т.е. никакого явного соединения между ними не устанавливается -- сообщение отправляется указанному сокету и, соответственно, может получаться от указанного сокета.

Потоковые сокеты по сравнению с дейтаграммными действительно дают более надежный метод, но для некоторых приложений накладные расходы, связанные с установкой явного соединения, неприемлемы (например, сервер времени суток, обеспечивающий синхронизацию времени для своих клиентов). В конце концов на установление надежного соединения с сервером требуется время, которое просто вносит задержки в обслуживание, и задача серверного приложения не выполняется. Для сокращения накладных расходов нужно использовать дейтаграммные сокеты.

Использование дейтаграммных сокетов требует, чтобы передачей данных от клиента к серверу занимался User Datagram Protocol (UDP). В этом протоколе на размер сообщений налагаются некоторые ограничения, и в отличие от потоковых сокетов, умеющих надежно отправлять сообщения серверу-адресату, дейтаграммные сокеты надежность не обеспечивают. Если данные затерялись где-то в сети, сервер не сообщит об ошибках.

Кроме двух рассмотренных типов существует также обобщенная форма сокетов, которую называют необрабатываемыми или сырыми.

- Сырые сокеты (raw socket)

Главная цель использования сырых сокетов состоит в обходе механизма, с помощью которого компьютер обрабатывает TCP/IP. Это достигается обеспечением специальной реализации стека TCP/IP, замещающей механизм, предоставленный стеком TCP/IP в ядре -- пакет непосредственно передается приложению и, следовательно, обрабатывается гораздо эффективнее, чем при проходе через главный стек протоколов клиента.

По определению, сырой сокет -- это сокет, который принимает пакеты, обходит уровни TCP и UDP в стеке TCP/IP и отправляет их непосредственно приложению.

При использовании таких сокетов пакет не проходит через фильтр TCP/IP, т.е. никак не обрабатывается, и предстает в своей сырой форме. В таком случае обязанность правильно обработать все данные и выполнить такие действия, как удаление заголовков и разбор полей, ложится на получающее приложение -- все равно, что включить в приложение небольшой стек TCP/IP.

Однако нечасто может потребоваться программа, работающая с сырыми сокетами. Если вы не пишете системное программное обеспечение или программу, аналогичную анализатору пакетов, вникать в такие детали не придется. Сырые сокеты главным образом используются при разработке специализированных низкоуровневых протокольных приложений. Например, такие разнообразные утилиты TCP/IP, как trace route, ping или arp, используют сырые сокеты.

Работа с сырыми сокетами требует солидного знания базовых протоколов TCP/UDP/IP.

2.1.2 Порты

Порт определен, чтобы разрешить задачу одновременного взаимодействия с несколькими приложениями. По существу, с его помощью расширяется понятие IP-адреса. Компьютер, на котором в одно время выполняется несколько приложений, получая пакет из сети, может идентифицировать целевой процесс, пользуясь уникальным номером порта, определенным при установлении соединения.

Сокет состоит из IP-адреса машины и номера порта, используемого приложением TCP. Поскольку IP-адрес уникален в Интернете, а номера портов уникальны на отдельной машине, номера сокетов также уникальны во всем Интернете. Эта характеристика позволяет процессу общаться через сеть с другим процессом исключительно на основании номера сокета.

За определенными службами номера портов зарезервированы -- это широко известные номера портов, например, порт 21, использующийся в FTP. Ваше приложение может пользоваться любым номером порта, который не был зарезервирован и пока не занят. Агентство Internet Assigned Numbers Authority (IANA) ведет перечень широко известных номеров портов.

Обычно приложение клиент-сервер, использующее сокеты, состоит из двух разных приложений - клиента, инициирующего соединение с целью (сервером), и сервера, ожидающего соединения от клиента.

Например, на стороне клиента, приложение должно знать адрес цели и номер порта. Отправляя запрос на соединение, клиент пытается установить соединение с сервером:

Отправление запроса клиента на сервер представлена на рис. 2.1

Рис. 2.1 - Отправление запроса клиента на сервер

Если события развиваются удачно, при условии, что сервер запущен прежде, чем клиент попытался с ним соединиться, сервер соглашается на соединение. Дав согласие, серверное приложение создает новый сокет для взаимодействия именно с установившим соединение клиентом:

Установление соединения сервера с клиентом представлена на рис. 2.2

Рис. 2.2 - Установление соединения сервера с клиентом

Теперь клиент и сервер могут взаимодействовать между собой, считывая сообщения каждый из своего сокета и, соответственно, записывая сообщения.

2.1.3 Работа с сокетами в.NET

Поддержку сокетов в.NET обеспечивают классы в пространстве имен System.Net.Sockets -- начнем с их краткого описания.

В таблице 2.1 описаны классы для работы с сокетами.

Таблица 2.1 Классы для работы с сокетами

Класс

Описание

MulticastOption

Класс MulticastOption устанавливает значение IP-адреса для присоединения к IP-группе или для выхода из нее.

NetworkStream

Класс NetworkStream реализует базовый класс потока, из которого данные отправляются и в котором они получаются. Это абстракция высокого уровня, представляющая соединение с каналом связи TCP/IP.

TcpClient

Класс TcpClient строится на классе Socket, чтобы обеспечить TCP-обслуживание на более высоком уровне. TcpClient предоставляет несколько методов для отправки и получения данных через сеть.

TcpListener

Этот класс также построен на низкоуровневом классе Socket. Его основное назначение -- серверные приложения. Он ожидает входящие запросы на соединения от клиентов и уведомляет приложение о любых соединениях.

UdpClient

UDP -- это протокол, не организующий соединение, следовательно, для реализации UDP-обслуживания в.NET требуется другая функциональность.

SocketException

Это исключение порождается, когда в сокете возникает ошибка.

Socket

Последний класс в пространстве имен System.Net.Sockets -- это сам класс Socket. Он обеспечивает базовую функциональность приложения сокета.

2.1.4 Класс Socket

Класс Socket играет важную роль в сетевом программировании, обеспечивая функционирование как клиента, так и сервера. Главным образом, вызовы методов этого класса выполняют необходимые проверки, связанные с безопасностью, в том числе проверяют разрешения системы безопасности, после чего они переправляются к аналогам этих методов в Windows Sockets API.

Прежде чем обращаться к примеру использования класса Socket, рассмотрим некоторые важные свойства и методы этого класса:

В таблице 2.2 описаны классы для работы с сокетами.

Таблица 2.2 Свойства и методы класса Socket

Свойство или метод

Описание

AddressFamily

Дает семейство адресов сокета -- значение из перечисления Socket.AddressFamily.

Available

Возвращает объем доступных для чтения данных.

Blocking

Дает или устанавливает значение, показывающее, находится ли сокет в блокирующем режиме.

Connected

Возвращает значение, информирующее, соединен ли сокет с удаленным хостом.

LocalEndPoint

Дает локальную конечную точку.

ProtocolType

Дает тип протокола сокета.

RemoteEndPoint

Дает удаленную конечную точку сокета.

SocketType

Дает тип сокета.

Accept()

Создает новый сокет для обработки входящего запроса на соединение.

Bind()

Связывает сокет с локальной конечной точкой для ожидания входящих запросов на соединение.

Close()

Заставляет сокет закрыться.

Connect()

Устанавливает соединение с удаленным хостом.

GetSocketOption()

Возвращает значение SocketOption.

IOControl()

Устанавливает для сокета низкоуровневые режимы работы. Этот метод обеспечивает низкоуровневый доступ к лежащему в основе классу Socket.

Listen()

Помещает сокет в режим прослушивания (ожидания). Этот метод предназначен только для серверных приложений.

Receive()

Получает данные от соединенного сокета.

Poll()

Определяет статус сокета.

Select()

Проверяет статус одного или нескольких сокетов.

Send()

Отправляет данные соединенному сокету.

SetSocketOption()

Устанавливает опцию сокета.

Shutdown()

Запрещает операции отправки и получения данных на сокете.

2.2 Сетевой протокол TCP

TCP или Transmission Control Protocol, используется как надежный протокол, обеспечивающий взаимодействие через взаимосвязанную сеть компьютеров. TCP проверяет, что данные доставляются по назначению и правильно.

2.2.1 TCP

TCP -- это ориентированный на соединения протокол, предназначенный для обеспечения надежной передачи данных между процессами, выполняемыми или на одном и том же компьютере или на разных компьютерах. Термин "ориентированный на соединения" означает, что два процесса или приложения прежде чем обмениваться какими-либо данными должны установить TCP-соединение. В этом TCP отличается от протокола UDP, являющегося протоколом "без организации соединения", позволяющим выполнять широковещательную передачу данных неопределенному числу клиентов.

Когда приложение отправляет данные, используя TCP, они перемещаются вниз по стеку протоколов. Данные проходят по всем уровням и в конце концов передаются через сеть как поток битов. Каждый уровень в наборе протоколов TCP/IP добавляет к данным некоторую информацию в форме заголовков.

Когда пакет прибывает на конечный узел в сети, он снова проходит через все уровни снизу доверху. Каждый уровень проверяет данные, отделяя от пакета свою информацию в заголовке и наконец данные достигают серверного приложения в той же самой форме, в какой они покинули приложение-клиент:

Прохождение пакета через уровни представлена на рис. 2.3

Рис. 2.3 - Прохождение пакета через уровни

Прежде чем рассматривать, как TCP устанавливает соединение с другим хостом TCP, приведем несколько терминов, которые необходимо определить:

- Сегмент

Порция данных, которую TCP отправляет IP, называется сегментом TCP.

- Дейтаграмма

Порция данных, которую IP отправляет уровню сетевого интерфейса, называется дейтаграммой IP.

- Порядковый номер

Каждый сегмент TCP, отправленный через соединение, имеет назначенное ему число, которое называется "порядковым номером" (sequence number). Оно используется, чтобы гарантировать прибытие данных в правильном порядке.

Чтобы понять, как работает TCP, вкратце рассмотрим структуру заголовка TCP:

Структура заголовка TCP представлена на рис. 2.4

Рис. 2.4 - Структура заголовка

Порядковые номера и номера подтверждений используются TCP, чтобы гарантировать, что все данные прибывают в правильном порядке, а биты управления содержат разнообразные флаги, указывающие статус данных. Таких битов управления (обычно представляемых трехбуквенными сокращениями) всего шесть:

· URG -- указывает, что сегмент содержит срочные данные.

· ACK -- указывает, что сегмент содержит номер подтверждения.

· PSH -- указывает, что данные нужно протолкнуть к получающему пользователю.

· RST -- сбрасывает соединение.

· SYN -- используется для синхронизации порядковых номеров.

· FIN -- указывает конец данных.

Для установления соединения TCP использует процесс, называемый "трехфазным квитированием" (Three-Phase Handshake). Как следует из названия, этот процесс включает три шага:

1. Клиент инициирует взаимодействие с сервером, посылая сегмент с установленным битом SYN. Этот сегмент содержит начальный порядковый номер клиента.

2. Сервер отвечает отправкой сегмента с установленными битами SYN и ACK. Этот сегмент содержит начальный порядковый номер сервера (не связанный с порядковым номером клиента) и номер подтверждения, на единицу больший порядкового номера клиента (т.е. равный следующему порядковому номеру, ожидаемому от клиента).

3. Клиент должен подтвердить этот сегмент отправкой обратно сегмента с установленным битом ACK. Номер подтверждения будет на единицу больше порядкового номера сервера, а порядковый номер будет равен номеру подтверждения сервера (т. е. на единицу больше начального порядкового номера клиента).

Теперь, узнав в общих чертах, как TCP устанавливает соединения, рассмотрим немного подробнее несколько операций TCP, чтобы понять, как TCP передает данные.

TCP передает данные порциями, которые называются сегментами. Чтобы гарантировать правильное и в должном порядке получение сегментов, каждому из них назначается порядковый номер. Получатель отправляет подтверждение получения сегмента. Если подтверждение не получено до истечения интервала - тайм-аута, данные отправляются еще раз. Каждому октету (восьми битам) данных назначается порядковый номер. Порядковый номер сегмента равен порядковому номеру первого октета данных в сегменте и это число отправляется в заголовке TCP данного сегмента.

TCP использует порядковые номера, чтобы гарантировать, что дублирующие данные получающему приложению переданы не будут и данные будут доставлены в правильном порядке. Заголовок TCP содержит контрольную сумму, чтобы гарантировать корректность данных при доставке. Если получен сегмент с неверной контрольной суммой, он просто отбрасывается, и подтверждение не отправляется. Это означает, что, когда значение тайм-аута истечет, отправитель повторит передачу сегмента.

TCP управляет объемом направляемых ему данных, возвращая с каждым подтверждением "размер окна". "Окно" -- это объем данных, который может принять получатель. Между прикладной программой и потоком данных в сети располагается буфер данных. "Размер окна" фактически представляет собой разность между размером буфера и объемом сохраненных в нем данных. Это число отправляется в заголовке, чтобы информировать удаленный хост о текущем размере окна. Такой прием называется "скользящим окном" ("Sliding Window").

На рисунке ниже показан алгоритм Sliding Window, управляющий потоком данных, передаваемых в сети:

Алгоритм "Sliding Window" представлен на рис. 2.5

Рис. 2.5 - Алгоритм "Sliding Window"

Полученные данные сохраняются в этом буфере, и приложение может обращаться к буферу и считывать из него данные со свойственной ему скоростью. По мере того как приложение считывает данные, буфер опустошается и может принимать следующие данные, поступающие из сети.

Если приложение считывает данные из буфера слишком медленно, размер окна падает до нуля, и удаленный хост получает команду прекратить передачу данных. Как только локальное приложение обработает данные в буфере, размер окна возрастает и поступление данных из сета возобновляется. Если размер окна больше размера пакета, отправитель знает, что получатель может хранить одновременно несколько пакетов, что повышает производительность.

TCP дает возможность нескольким процессам на одной машине одновременно использовать сокет TCP. Сокет TCP состоит из адреса хоста и уникального номера порта, а TCP-соединение включает два сокета на разных концах сети. Порт может использоваться для нескольких соединений одновременно -- один сокет на одном конце может использоваться для нескольких соединений с разными сокетами на другом конце. Примером этой ситуации служит Web-cepвep, слушающий порт 80 и отвечающий на запросы от нескольких компьютеров.

Поддержка сокетов TCP на платформе.NET значительно усовершенствована по сравнению с предыдущей моделью программирования. Раньше большинство разработчиков, использовавших Visual С++, для реализации любых типов взаимодействия сокетов, обращались к классам CSocket и CAsyncSocket или пользовались библиотеками независимых поставщиков.

Для высокоуровневого программирования TCP встроенная поддержка практически отсутствовала. В.NET для работы с сокетами предоставлено особое пространство имен System.Net.Sockets. Это пространство имен содержит не только такие низкоуровневые классы, как Socket, но и классы высокого уровня TcpClient и TcpListener, предлагающие простые интерфейсы для взаимодействия через TCP.

В отличие от класса Socket, в котором для отправки и получения данных применяется побайтовый подход, классы TcpClient и TcpListener придерживаются потоковой модели. В этих классах все взаимодействие между клиентом и сервером базируется на потоке с использованием класса NetworkStream. Однако при необходимости можно работать с байтами.

2.2.2 Класс TcpClient

Класс TcpClient обеспечивает TCP-сервисы для соединений на стороне клиента. Он построен на классе Socket и обеспечивает TCP-сервисы на более высоком уровне -- в классе TcpClient есть закрытый объект данных m_ClientSocket, используемый для взаимодействия с сервером TCP. Класс TcpClient предоставляет простые методы для соединения через сеть с другим приложением сокетов, отправки ему данных и получения данных от него. Наиболее важные члены класса TcpClient перечислены далее. В таблице 2.3 Описаны члены класса TcpClient.

Таблица 2.3 Члены класса TcpClient

Свойство или метод

Тип

Описание

LingerState

LingerOption

Устанавливает или возвращает объект LingerOption, содержащий информацию о том, будет ли соединение оставаться открытым после закрытия сокета и как долго.

NoDelay

bool

Указывает, будет ли сокет задерживать отправку и получение данных, если буфер, назначенный для отправки или получения данных, не заполнен. Если свойство имеет значение false, TCP задержит отправку пакета, пока не будет накоплен достаточный объем данных. Это средство помогает избежать неэффективной отправки через сеть слишком маленьких пакетов.

ReceiveBufferSize

int

Задает размер буфера для входящих данных (в байтах). Это свойство используется при считывании данных из сокета.

ReceiveTimeout

int

Задает время в миллисекундах, которое TCpClient будет ждать получения данных после инициирования этой операции. Если это время истечет, а данные не будут получены, возникнет исключение SocketException.

SendBufferSize

int

Задает размер буфера для исходящих данных.

SendTimeout

int

Задает время в миллисекундах, которое TcpClient будет ждать подтверждения числа байтов, отправленных удаленному хосту от базового сокета. При истечении времени SendTimeout порождается исключение SocketException.

Close()

Закрывает TCP-соединение.

Connect()

Соединяется с удаленным хостом TCP.

GetStream()

Возвращает объект NetworkStream, используемый для передачи данных между клиентом и удаленным хостом.

Active

bool

Указывает, есть ли активное соединение с удаленным хостом.

Client

Socket

Задает базовый объект Socket, используемый объектом TcpClient. Поскольку это защищенное свойство, к базовому сокету можно обращаться, если вы производите ваш класс от TcpClient.

2.3 Сетевой протокол UDP

2.3.1 UDP

UDP -- User Datagram Protocol

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

UDP не требует открывать соединение, и данные могут быть отправлены сразу же, как только они подготовлены. UDP не отправляет подтверждающие сообщения, поэтому данные могут быть получены или потеряны. Если при использовании UDP требуется надежная передача данных, ее следует реализовать в протоколе более высокого уровня.

Так в чем же преимущества UDP, зачем может понадобиться такой ненадежный протокол? Чтобы понять причину использования UDP, нужно различать однонаправленную передачу, широковещательную передачу и групповую рассылку.

Однонаправленное (unicast) сообщение отправляется из одного узла только в один другой узел. Это также называется связью "точка-точка". Протокол TCP поддерживает лишь однонаправленную связь. Если серверу нужно с помощью TCP взаимодействовать с несколькими клиентами, каждый клиент должен установить соединение, поскольку сообщения могут отправляться только одиночным узлам.

Широковещательная передача (broadcast) означает, что сообщение отправляется всем узлам сети. Групповая рассылка (multicast) - это промежуточный механизм: сообщения отправляются выбранным группам узлов.

UDP может использоваться для однонаправленной связи, если требуется быстрая передача, например, для доставки мультимедийных данных, но главные преимущества UDP касаются широковещательной передачи и групповой рассылки.

Обычно, когда мы отправляем широковещательные или групповые сообщения, не нужно получать подтверждения из каждого узла, поскольку тогда сервер будет наводнен подтверждениями, а загрузка сети возрастет слишком сильно. Примером широковещательной передачи является служба времени. Сервер времени отправляет широковещательное сообщение, содержащее текущее время, и любой хост, если пожелает, может синхронизировать свое время с временем из широковещательного сообщения.

Заголовок UDP гораздо короче и проще заголовка TCP:

Таблица 2.4 Заголовки UDP

Поле

Длина

Описание

Порт источника

2 байта

Указание порта источника для UDP необязательно. Если это поле используется, получатель может отправить ответ этому порту.

Порт назначения

2 байта

Номер порта назначения

Длина

2 байта

Длина сообщения, включая заголовок и данные.

Контрольная сумма

2 байта

Контрольная сумма заголовка и данных для проверки

UDP -- это быстрый протокол, не гарантирующий доставки. Если требуется поддержание порядка сообщений и надежная доставка, нужно использовать TCP. UDP главным образом предназначен для широковещательной и групповой передачи.

2.4 Выбор сетевого протокола

В дипломной работе было рассмотрено 2 вида сетевого протокола. TCP и UDP, за явным преимуществом первого. У UDP нет надобности использовать сервер, данные напрямую передаются от одного узла к другому. Снижаются накладные расходы при передаче, по сравнению с TCP, сами данные передаются быстрее. Все посылаемые сообщения по протоколу UDP называются дейтаграммами. Также через UDP можно передавать широковещательные сообщения для набора адресов в подсети.

В то же время UDP имеет недостатки по сравнению с TCP. В частности, UDP не гарантирует доставку дейтаграммы конечному адресу. Поэтому данный протокол подходит больше для передачи изображений, мультимедийных файлов, потокового аудио, видео и т.п., когда недостаток небольшого количества потерянных при передаче дейтаграмм не сильно скажется на качестве переданных данных.

UDP обычно используется в таких приложениях, как потоковое видео и компьютерные игры, где допускается потеря пакетов, а повторный запрос затруднён или не оправдан, либо в приложениях вида запрос-ответ (например, запросы к DNS), где создание соединения занимает больше ресурсов, чем повторная отправка.

TCP -- «гарантированный» транспортный механизм с предварительным установлением соединения, предоставляющий приложению надёжный поток данных, дающий уверенность в безошибочности получаемых данных, перезапрашивающий данные в случае потери и устраняющий дублирование данных. TCP позволяет регулировать нагрузку на сеть, а также уменьшать время ожидания данных при передаче на большие расстояния. Более того, TCP гарантирует, что полученные данные были отправлены точно в такой же последовательности. В этом его главное отличие от UDP.

Гарантированная доставка - главное для приложения, работающего с обменом сообщений в сети. Это и является главной причиной выбора этого сетевого протокола для реализации дипломной работы.

2.5 Описание разработанных компонентов программы сервера

2.5.1 Класс ClientObject

Создаём консольный проект сервера, который назовем ChatServer. В этот проект добавим два новых класса ClientObject и ServerObject. Опишем класс ClientObject:

using System;

using System.Net.Sockets;

using System.Text;

namespace ChatServer

{

public class ClientObject

{

protected internal string Id { get; private set; }

protected internal NetworkStream Stream { get; private set; }

string userName;

TcpClient client;

ServerObject server; // объект сервера

public ClientObject(TcpClient tcpClient, ServerObject serverObject)

{

Id = Guid.NewGuid().ToString();

client = tcpClient;

server = serverObject;

serverObject.AddConnection(this);

}

public void Process()

{

try

{

Stream = client.GetStream();

// получаем имя пользователя

string message = GetMessage();

userName = message;

message = userName + " вошел в чат";

// посылаем сообщение о входе в чат всем подключенным пользователям

server.BroadcastMessage(message, this.Id);

Console.WriteLine(message);

// в бесконечном цикле получаем сообщения от клиента

while (true)

{

try

{

message = GetMessage();

message = String.Format("{0}: {1}", userName, message);

Console.WriteLine(message);

server.BroadcastMessage(message, this.Id);

}

catch

{

message = String.Format("{0}: покинул чат", userName);

Console.WriteLine(message);

server.BroadcastMessage(message, this.Id);

break;

}

}

}

catch (Exception e)

{

Console.WriteLine(e.Message);

}

finally

{

// в случае выхода из цикла закрываем ресурсы

server.RemoveConnection(this.Id);

Close();

}

}

// чтение входящего сообщения и преобразование в строку

private string GetMessage()

{

byte[] data = new byte[64]; // буфер для получаемых данных

StringBuilder builder = new StringBuilder();

int bytes = 0;

do

{

bytes = Stream.Read(data, 0, data.Length);

builder.Append(Encoding.Unicode.GetString(data, 0, bytes));

}

while (Stream.DataAvailable);

return builder.ToString();

}

// закрытие подключения

protected internal void Close()

{

if (Stream != null)

Stream.Close();

if (client != null)

client.Close();

}

}

}

У объекта ClientObject будет устанавливаться свойство Id, которое будет уникально его идентифицировать, и свойство Stream, хранящее поток для взаимодействия с клиентом. При создании нового объекта в конструкторе будет происходить его добавление в коллекцию подключений класса ServerObject, который мы создадим:

serverObject.AddConnection(this);

Основные действия происходят в методе Process(), в котором реализован простейший протокол для обмена сообщениями с клиентом. Так, в начале получаем имя подключенного пользователя, а затем в цикле получаем все остальные сообщения. Для трансляции этих сообщений всем остальным клиентам будет использоваться метод BroadcastMessage() класса ServerObject.

2.5.2 Класс ServerObject

Опишем класс ServerObject:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Net.Sockets;

using System.Net;

using System.Text;

using System.Threading;

namespace ChatServer

{

public class ServerObject

{

static TcpListener tcpListener; // сервер для прослушивания

List<ClientObject> clients = new List<ClientObject>(); // все подключения

protected internal void AddConnection(ClientObject clientObject)

{

clients.Add(clientObject);

}

protected internal void RemoveConnection(string id)

{

// получаем по id закрытое подключение

ClientObject client = clients.FirstOrDefault(c => c.Id == id);

// и удаляем его из списка подключений

if (client != null)

clients.Remove(client);

}

// прослушивание входящих подключений

protected internal void Listen()

{

try

{

tcpListener = new TcpListener(IPAddress.Any, 8888);

tcpListener.Start();

Console.WriteLine("Сервер запущен. Ожидание подключений...");

while (true)

{

TcpClient tcpClient = tcpListener.AcceptTcpClient();

ClientObject clientObject = new ClientObject(tcpClient, this);

Thread clientThread = new Thread(new ThreadStart(clientObject.Process));

clientThread.Start();

}

}

catch (Exception ex)

{

Console.WriteLine(ex.Message);

Disconnect();

}

}

// трансляция сообщения подключенным клиентам

protected internal void BroadcastMessage(string message, string id)

{

byte[] data = Encoding.Unicode.GetBytes(message);

for (int i = 0; i < clients.Count; i++)

{

if (clients[i].Id != id) // если id клиента не равно id отправляющего

{

clients[i].Stream.Write(data, 0, data.Length); //передача данных

}

}

}

// отключение всех клиентов

protected internal void Disconnect()

{

tcpListener.Stop(); //остановка сервера

for (int i = 0; i < clients.Count; i++)

{

clients[i].Close(); //отключение клиента

}

Environment.Exit(0); //завершение процесса

}

}

}

Все подключенные клиенты будут храниться в коллекции clients. С помощью методов AddConnection и RemoveConnection мы можем управлять добавлением / удалением объектов из этой коллекции.

Основной метод - Listen(), в котором будет осуществляться прослушивание всех входящих подключений. При получении подключения будет запускаться новый поток, в котором будет выполняться метод Process объекта ClientObject.

Для передачи сообщений всем клиентам, кроме отправившего, предназначен метод BroadcastMessage().

Таким образом разделяются сущность подключенного клиента и сущность сервера.

2.5.3 Класс Program

Запускаем прослушивание в основном классе программы. Изменяем класс Program:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Threading;

namespace ChatServer

{

class Program

{

static ServerObject server; // сервер

static Thread listenThread; // потока для прослушивания

static void Main(string[] args)

{

try

{

server = new ServerObject();

listenThread = new Thread(new ThreadStart(server.Listen));

listenThread.Start(); //старт потока

}

catch (Exception ex)

{

server.Disconnect();

Console.WriteLine(ex.Message);

}

}

}

}

Запускаем новый поток, который обращается к методу Listen() объекта ServerObject.

2.6 Описание разработанных компонентов программы клиента

2.6.1 Класс Program

Создаём новый консольный проект для клиента, который назовем ChatClient. Изменим его стандартный класс Program следующим образом:

using System;

using System.Threading;

using System.Net.Sockets;

using System.Text;

namespace ChatClient

{

class Program

{

static string userName;

private const string host = "127.0.0.1";

private const int port = 8888;

static TcpClient client;

static NetworkStream stream;

static void Main(string[] args)

{

Console.Write("Введите свое имя: ");

userName = Console.ReadLine();

client = new TcpClient();

try

{

client.Connect(host, port); //подключение клиента

stream = client.GetStream(); // получаем поток

string message = userName;

byte[] data = Encoding.Unicode.GetBytes(message);

stream.Write(data, 0, data.Length);

// запускаем новый поток для получения данных

Thread receiveThread = new Thread(new ThreadStart(ReceiveMessage));

receiveThread.Start(); //старт потока

Console.WriteLine("Добро пожаловать, {0}", userName);

SendMessage();

}

catch (Exception ex)

{

Console.WriteLine(ex.Message);

}

finally

{

Disconnect();

}

}

// отправка сообщений

static void SendMessage()

{

Console.WriteLine("Введите сообщение: ");

while (true)

{

string message = Console.ReadLine();

byte[] data = Encoding.Unicode.GetBytes(message);

stream.Write(data, 0, data.Length);

}

}

// получение сообщений

static void ReceiveMessage()

{

while (true)

{

try

{

byte[] data = new byte[64]; // буфер для получаемых данных

StringBuilder builder = new StringBuilder();

int bytes = 0;

do

{

bytes = stream.Read(data, 0, data.Length);

builder.Append(Encoding.Unicode.GetString(data, 0, bytes));

}

while (stream.DataAvailable);

string message = builder.ToString();

Console.WriteLine(message);//вывод сообщения

}

catch

{

Console.WriteLine("Подключение прервано!"); //соединение было прервано

Console.ReadLine();

Disconnect();

}

}

}

static void Disconnect()

{

if (stream != null)

stream.Close();//отключение потока

if (client != null)

client.Close();//отключение клиента

Environment.Exit(0); //завершение процесса

}

}

}

Чтобы не блокировать ввод сообщений в главном потоке, для получения сообщений создается новый поток, который обращается к методу ReceiveMessage.

3. Руководство пользователя

3.1 Выполнение приложения

Необходимо переместить папку с программой на жёсткий диск компьютера для последующего запуска. В папке запустить файл «ChatServer.exe»

В появившемся окне появится сообщение: «Сервер запущен. Ожидание подключений…»

Рабочие окно сервера представлено на рис. 3.1

Рис. 3.1 - Рабочие окно сервера

После запускаем саму программу, то бишь клиент, она имеет название «ClientChat.exe»

Окно ввода «никнейма» представлено на рис. 3.2

Рис. 3.2 - Окно ввода «никнейма»

Входными данными в программе является «Имя», пользователя под которым он будет подключаться к «комнате» и виртуальный адрес компьютера, на котором запущен сервер. И текстовые сообщения, отправляемые пользователем.

Окно ввода сообщения представлено на рис. 3.3

Рис. 3.3 - Окно ввода сообщения

3.2 Пример выполнения разработанного приложения

При работе сервера всегда будут отображаться подключённые пользователи как показано на рис. 3.4

Рис. 3.4 - Вывод сообщения о подключённых пользователях

Работа чата, отправка и получение сообщений, показано со стороны одного из программ клиентов, отображаемых на рис. 3.5

Рис. 3.6 - Работа программы клиента

программирование интернет сервер сеть

3.3 Общие сведения о программе

Сетевой чат, помимо передаваемой пользователями информации, должен иметь доступное управление.

Приложение имеет следующие системные требования:

· Intel Pentium 1.2 GHz и выше

· Оперативная память 256 Мб и выше

· Графическая память 128 Мб и выше

· Свободное место на жёстком диске - 5 Мб

· Операционная система Windows XP, 7, 8.1, 10

· Интернет соединение - 128 кбит/сек. и выше

Заключение

Предметом разработки данного дипломной работы предполагалось создание программного продукта для общения пользователей в сети интернет и локальных сетях. В данной работе описаны методы необходимые для создания подобного рода ПО.

На рынке программного обеспечения (ПО) представлена масса подобных приложений, которые помогают решать проблемы, затронутые в данной работе. Но подобного рода программы требуют от пользователей ПК максимум знаний в области информационных технологий. Ещё один аспект - системные ресурсы компьютера. В совокупности этих причин мной было принято решение написания данного приложения.

Данное приложение имеет возможность, имея минимальные знания работы на персональном компьютере свободно пользоваться программным продуктом.

...

Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.