Организация речевого диалога по локальной сети в дуплексном режиме

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 28.04.2014
Размер файла 1,9 M

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

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

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

Содержание

Введение

1. Исследовательская часть

1.1 Техническое задание

1.2 Анализ существующих систем организации аудиосвязи

1.3 Протоколы аудиопередачи

2. Конструкторская часть

2.1 Архитектура сетевого взаимодействия

2.2 Описание протокола передачи данных

2.2.1 Взаимодействие клиента с сервером

2.2.2 Взаимодействие между клиентами

2.3 Алгоритм серверного приложения

2.4 Структура клиентского приложения

3. Технологическая часть

3.1 Средства программирования и отладки

3.2 Требования к системе

3.3 Описание программных модулей проекта

3.3.1 Описание модулей серверного приложения

3.3.2 Описание модулей клиентского приложения

3.4 Описание пользовательского интерфейса

3.5 Результаты тестирования разработанного средства

Выводы

Заключение

Приложение

Введение

аудиопередача протокол клиентский серверный

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

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

1. Исследовательская часть

1.1 Техническое задание

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

Система ориентирована на операционные системы Windows XP/Vista/7;

Предусмотреть аутентификацию и авторизацию пользователя на сервере;

Должно быть реализовано ведение журнала сетевых взаимодействий для сервера;

Обеспечить корректную обработку ошибок и исключительных ситуаций.

1.2 Анализ существующих систем организации аудиосвязи

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

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

Skype (http://www.skype.com/intl/ru/get-skype)

Skype (последняя версия 5.10.66.116, страна-производитель: США, компания Microsoft, 2012г.) - бесплатное проприетарное программное обеспечение с закрытым кодом, обеспечивающее шифрованную голосовую связь через Интернет между компьютерами (VoIP), а также платные услуги для связи с абонентами обычной телефонной сети.

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

Недостатки:

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

Skype -- это чёрный ящик с многоуровневой системой шифрования, напичканной антиотладочными приёмами исполняемого файла, считывающий с компьютера конфиденциальную информацию и передающий её в сеть по закрытому протоколу.

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

GoogleTalk (http://www.google.com/talk/intl/ru.html)

Google Talk (последняя версия 1.0.0.105, страна-производитель: США, компания Google, 2007г.) - программа мгновенного обмена сообщениями, разработанная компанией Google. Доступна для следующих операционных систем Microsoft Windows(XP, Server 2003, Vista, и Windows 7), Android, BlackBerry и Google Chrome OS.

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

Недостатки:

Зависимость от учетной записи Gmail.

Asterisk (http://www.asterisk.org)

Asterisk (последняя версия 10.9.0, страна-производитель: США, сообщество Digium, 2007г.) - свободное решение компьютерной телефонии (в том числе, VoIp) с открытым исходным кодом от компании Digium, первоначально разработанное Марком Спенсером. Приложение работает на операционных системах Linux, FreeBSD, OpenBSD и Solaris.

Asterisk в комплексе с необходимым оборудованием обладает всеми возможностями классической АТС, поддерживает множество VoIP-протоколов и предоставляет богатые функции управления звонками, среди них: голосовая почта, конференции, интерактивное голосовое меню (IVR), центр обработки вызовов (постановка звонков в очередь и распределение их по агентам используя различные алгоритмы), запись (Call Detail Record).

Недостатки:

Приложение работает на операционных системах GNU/Linux, FreeBSD и Solaris.

Сложность в администрировании. Администратору системы требуется обладать знаниями в Asterisk и хорошими навыками администрирования Linux, знать технологии и продукты IP телефонии.

iChat (http://www.apple.com/macosx/what-is-macosx/ichat.html)

iChat (последняя версия 3.19.0.111, страна-производитель: США, компания Apple, 2010г.) -- программа для мгновенного обмена сообщениями, представлена компанией Apple Inc. Специфика данной программы в том, что она разработана под платформу Macintosh. В новой версии добавлены функции голосового и видео чата. Входит в стандартную поставку Mac OS X.

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

Поддерживаемые протоколы: OSCAR (AIM, ICQ), XMPP (Jabber), Bonjour LAN Chat.

Недостатки:

Поддерживает только платформу Macintosh.

1.3 Протоколы аудиопередачи

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

В приложениях реального времени отправитель генерирует поток данных с постоянной скоростью, а получатель (или получатели) должен предоставлять эти данные приложению с той же самой скоростью. Такие приложения включают, например, аудио- и видеоконференции, живое видео, удаленную диагностику в медицине, компьютерную телефонию, распределенное интерактивное моделирование, игры, мониторинг в реальном времени и др.

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

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

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

Вывод по исследовательской части

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

Разработка протокола общения сервера с клиентом;

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

Организация аудиосвязи между клиентами;

2. Конструкторская часть

2.1 Архитектура сетевого взаимодействия

Для сетевого взаимодействия применяется гибридная архитектура.

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

Рисунок 2.1. Архитектура «клиент-сервер»

Она обеспечивает централизованное управление клиентами на сервере и эффективное гарантированное взаимодействие клиентов между собой через сервер.

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

Рисунок 2.2. Архитектура «точка-точка»

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

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

2.2 Описание протокола передачи данных

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

2.2.1 Взаимодействие клиента с сервером

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

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

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

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

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

Схема взаимодействия представлена на рисунке 2.3.

Рисунок 2.3. Схема взаимодействия между клиентом и сервером

2.2.2 Взаимодействие между клиентами

Взаимодействие между клиентами осуществляется как по протоколу TCP, так и по протоколу UDP.

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

По протоколу UDP производится непосредственно передача аудиоданных.

При инициировании запроса на передачу данных Клиент1 отправляет сообщение ConnectToClient Клиенту2, с которым он хочет соединиться.

Клиент2, получив сообщение, соглашается или отказывается от соединения и отправляет сообщение ConnectToClientSuccess или ConnectToClientFailed соответственно. Если соединение установлено, то начинается передача аудиоданных по протоколу UDP.

Если Клиент1 хочет прекратить передачу данных - он отправляет Клиенту2 сообщение DisconnectRequest, после чего оба клиента прекращают передачу медиаданных.

Схема взаимодействия между клиентами представлена на рисунке 2.4.

Рисунок 2.4. Схема взаимодействия между клиентами

2.3 Алгоритм серверного приложения

Серверное приложение выполняет управляющую функцию, функцию координатора клиентов, а также ведет журналирование.

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

Если тип пакета = AuthorizationRequest, то происходит регистрация нового пользователя на сервере.

При получении пакета с типом ConnectToClientRequest - происходит передача информации о клиенте, который хочет подключиться клиенту, к которому он хочет подключиться.

Получив пакет с типом IQuit - удаляет пользователя из списка активных пользователей и отсылает всем клиентам сообщение об отключившемся пользователе.

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

Рисунок 2.5. Блок схема алгоритма работы сервера

2.4 Структура клиентского приложения

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

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

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

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

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

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

Получив такой пакет, клиент читает информацию о пользователе и инициирует аудиопередачу.

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

При завершении аудиопередачи, клиент получает сообщение DisconnectRequest и прекращает передачу данных.

Алгоритм работы клиента показан на рисунке 2.6.

Рисунок 2.6. Блок-схема алгоритма работы клиента

3. Технологическая часть

3.1 Средства программирования и отладки

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

Средой разработки был выбран Microsoft Visual Studio 2010

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

Для записи и воспроизведения аудиоданных выбрана библиотека Voice.dll из-за простотоы использования и наличия открытого доступа к ней.

3.2 Требования к системе

Для нормального функционирования программного комплекса система должна удовлетворять следующим требованиям:

операционная система Windows XP, Windows Vista, Windows 7;

установленный .NET Framework 3.0;

библиотека Voice.dll;

наличие микрофона (встроенного или внешнего).

3.3 Описание программных модулей проекта

3.3.1 Описание модулей серверного приложения

Серверное приложение абстрактно можно представить в виде трех модулей.

Модуль создания соединений - основной модуль серверного приложения. Он представлен классом Server.

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

Здесь же инициализируется объект LogWriter, который отвечает за ведение журнала событий.

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

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

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

Модуль сбора статистики необходим для осуществления контроля действий, происходящих на сервере. Модуль представлен классом LogWriter.

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

Листинг программных модулей представлен в приложении.

3.3.2 Описание модулей клиентского приложения

Клиентское приложение абстрактно можно представить в виде трех модулей.

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

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

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

Модуль представлен двумя классом AudioTranceiver, который реализует соответственно передачу и получение аудиоданных.

Листинг программных модулей представлен в приложении.

3.4 Описание пользовательского интерфейса

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

Для того чтобы запустить приложение-сервер, необходимо запустить Server.exe файл, после чего появится окно авторизации (рисунок 3.1.).Можно

выбрать,будет ли виден пароль или нет (риунок 3.2.).

Рисунок 3.1. Окно авторизации

Рисунок 3.2. Окно авторизации

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

Рисунок 3.3. Сообщение о неверном пароле при запуске сервера

Интерфейс серверного приложения крайне прост. Его вид представлен на рисунке 3.4.

Рисунок 3.4. Интерфейс серверного приложения

В центре окна располагаются поле выбора IP адреса сервера из имеющихся (получаемых программно) и поле для ввода пароля для входа на сервер. Меню «Сервер» имеет подпункты «Включить», «Отключить» и «Выход» (см. Рисунок 3.5). Так же сервер можно включить, отключить или обновить список доступных IP адресов нажав на соответствующие кнопки.

Рисунок 3.5. «Меню файл»

Меню «Сервис» имеет подпункты «Просмотреть log-файл»,

«Удалить log- файл» (см. Рисунок 3.6).

Рисунок 3.6. «Меню сервис»

При нажатии на подпункт «Просмотреть log-файл» появляется окно просмотра файла журналирования (рисунок 3.7)

Рисунок 3.7. Окно просмотра log-файла

Чтобы запустить, приложение-клиент, необходимо запустить файл Client.exe ,после чего откроется окно программы, оно является главной составляющей пользовательского интерфейса. Его вид представлен на рисунке 3.8.

В центре главного окна располагается список пользователей, подключенных к конференции. Вверху располагается меню. Вкладка «Соединение» имеет подпункты «Подключение», «Отключение» и «Выход». (см. Рисунок 3.9.).Так же действия можно совершить, нажав на соответствующие кнопки снизу.

Рисунок 3.8. Главное окно клиентского приложения

Рисунок 3.9. Меню «Соединение»

При нажатии на пункт «Подключение» появляется диалоговое окно «Подключение» (см. рисунок 3.10.), с помощью которого можно осуществить подключение к серверу. В этом диалоговом окне расположены поле для ввода IP адреса сервера, поля для ввода логина и пароля пользователя.

Рисунок 3.10. Диалоговое окно «Соединение»

3.5 Результаты тестирования разработанного средства

В процессе тестирования было проверено, правильно ли работают клиент и сервер при штатном использовании и нештатных ситуациях.

При неверной авторизации пользователя, в случаях, если пароль неверен или пользователь с таким именем уже есть в сети, на экране появятся соответствующие сообщения (рисунки 3.11.и 3.12.).

Рис. 3.11. Сообщение клиенту о неверном пароле.

Рис. 3.12. Сообщение клиенту о неверном логине.

А также появятся соответствующие записи в журнале об этом:

13.12.2011 23:04:06 : Авторизация пользователя Ruslan неуспешна. Неправильный пароль.

13.12.2011 23:03:20 : Авторизация пользователя Ruslan неуспешна. Неправильное имя пользователя.

2.При попытке подключиться к неработающему серверу на экране клиентов выдается сообщение об ошибке (рисунок 3.13.).

Рис. 3.14. Сообщение клиенту об ошибке при попытке подключения к неработающему серверу.

3.Если сервер выключается, на экране клиентов выдается сообщение об ошибке (рисунок 3.14.).

При верной авторизации клиент подключится к серверу, имя клиента добавится в список активных пользователей и будет добавлена запись в журнал: “04.12.2011 18:36:39 : Авторизация пользователя Rusaln прошла успешно”

Рис. 3.14. Сообщение клиенту об отключении сервера.

4.Если, при диалоге, закрывает форму один из клиентов,не отключившись от диалога,на экране второго клиента выдается сообщение об ошибке (рисунок 3.15.).

Рис. 3.15. Сообщение клиенту об отключении второго клиента.

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

Выводы

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

В дальнейшем необходимо будет реализовать программный комплекс с заданным для него функционалом, который был указан в пункте 2.1., для взаимодействия между частями системы необходимо использовать протокол, описанный в пункте 2.2. Алгоритмы работы сервера и клиента были описаны в пунктах 2.3. и 2.4.

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

Для сервера был реализован следующий функционал:

Автоматический поиск IP-адресов, на которых может быть запущен сервер;

Запуск сервера;

Остановка сервера;

Журналирование. Используется файл serverLog.txt;

Просмотр и удаление файла журнала.

Для клиента был реализован следующий функционал:

1. Подключение к серверу;

2. Отключение от сервера;

3. Подключение к пользователю;

4. Отключение от пользователя;

5. Передача аудио-данных от пользователя к пользователю;

6. Уведомления о произошедших ошибках, возникших в процессе работы. Они реализованы в виде всплывающих окон.

Заключение

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

Функциональность приложения обусловлена базовыми требованиями к программам такого рода и включает в себя:

Возможность передачи сообщений с сервера на клиентское приложение.

Возможность записи аудиоданных на клиентском приложении.

Возможность работы с несколькими клиентами серверным приложением.

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

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

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

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

Выполненные задачи отражают основные принципы реализации аудиоконференции.

Приложение

Сервер:

namespace Server

{

class Server

{

private Socket socket;//сокет для приема и передачи данных клиентам

private IPAddress ipAddress;//ip адресс

private int port;//порт

private Thread mainThread;//главный поток соединений

private Thread broadcastThread;//поток для передачи данных

private LogWriter logWriter;//объект класс для раобыт с лог файлом

private List<User> users; //список зарегестрированных пользователей

private List<Connection> connections;//ссписок установленных соединений

private string password;

//конструктор класса

public Server(String _ipAddress, int _port, String _logFileName, String _password)

{ //получаем ip,порт,лог,список пользоват,cоединений и пароль

ipAddress = IPAddress.Parse(_ipAddress);

port = _port;

logWriter = new LogWriter(_logFileName);

users = new List<User>();

connections = new List<Connection>();

password = _password;

}

public void Start()

{

//Устанавливаем локальную конечную точку

IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, port);

//Создаем сокет, привязываем его к конечной точке и начинаем прослушивание

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

//привязываем сокет к конечной точке

socket.Bind(ipEndPoint);

//устанавливаем в режим прослушивания

socket.Listen(10);

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

broadcastThread = new Thread(Broadcast);

//поток фоновый

broadcastThread.IsBackground = true;

//запускаем

broadcastThread.Start();

//Создаем поток для приема соединений от клиентов

mainThread = new Thread(MainThread);

//фоновый

mainThread.IsBackground = true;

//

mainThread.Start();

//На радостях сообщаем об этом логу

logWriter.WriteToLogFile("Сервер запущен. IP-адрес: " + ipAddress.ToString() + " Порт: " + port.ToString());

}

public void Stop()

{

//Посылаем всем сообщения что сервер остановлен

foreach (Connection connection in connections)

SendMessage(connection, Messages.ServerClose);

//Удаляем соединения

connections.Clear();

//Закрываем сокет, завершаем поток

socket.Close();

mainThread.Abort();

//С горя пишем об этом в лог

logWriter.WriteToLogFile("Сервер остановлен");

}

private void Broadcast()

{

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

Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

//устанавливаем параметры

sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);

//gлучаем точку для передачи данных

IPEndPoint iep = new IPEndPoint(IPAddress.Broadcast, 9999);

//ip адресс в строку

string hostname = ipAddress.ToString();

//из строки посл-ть байтов

byte[] data = Encoding.ASCII.GetBytes(hostname);

while (true)

{

// посылаем,пауза

sock.SendTo(data, iep);

Thread.Sleep(600);

}

}

private void MainThread()

{

try

{

while (true)

{

//Ждем соединения

Socket connectionSocket = socket.Accept();

//Принимаем соединение

Connection connection = new Connection();

connection.socket = connectionSocket;

logWriter.WriteToLogFile("Новое соединение. " + connectionSocket.RemoteEndPoint.ToString());

//Создаем поток соединения

connection.thread = new Thread(ConnectionThread);

connection.thread.IsBackground = true;

connection.thread.Start(connection);

//Добавляем соединение в список

connections.Add(connection);

}

}

catch (ThreadAbortException e)

{

}

catch (Exception e)

{

Stop();

}

}

private void ConnectionThread(object param)

{

//Параметр в поток - объект соединения

Connection connection = (Connection)param;

try

{

while (true)

{

//Читаем тип сообщения

byte messageType = SocketReader.ReadType(connection.socket);

//Делаем что требуют

switch (messageType)

{//Клиент прислал запрос авторизации

case (byte)Messages.AuthorizationRequest:

{

if(!Authorization(connection))

return;

break;

}//Клиент хочет подключиться

case (byte)Messages.ConnectToClientRequest:

{

ConnectToClientRequest(connection);

break;

}//Клиент одобрил подключение

case (byte)Messages.ConnectToClientSuccess:

{

ConnectToClientSuccess(connection);

break;

} //Клиент не одобрил подключение

case (byte)Messages.ConnectToClientFailed:

{

ConnectToClientFailed(connection);

break;

}// клиент хочет отключиться

case (byte)Messages.DisconnectRequest:

{

DisconnectRequest(connection);

break;

}//Отключение пользователя

case (byte)Messages.IQuit:

{

DisconnectUser(connection);

return;

}

}

}

}

catch (Exception e)

{

logWriter.WriteToLogFile("Исклчение: " + e.Message);

}

finally

{

}

}

//Клиент хочет подключиться

private void ConnectToClientRequest(Connection connection)

{

// к кому подключаемся

User requestedUser = SocketReader.ReadUserRecord(connection.socket);

// информацию в log

logWriter.WriteToLogFile("Запрос на подключение от пользователя " + connection.userNickName + " пользователю " + requestedUser.nickName);

// проходим по соединениям и ищем к кому подключиться

foreach (Connection _connection in connections)

{

// нашли нужного пользователя

if (_connection.userNickName == requestedUser.nickName)

{

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

SendMessage(_connection, Messages.ConnectToClientRequest);

// записываем в сокет порт,имя и адрес

SocketWriter.WriteUserRecord(_connection.socket, connection.userNickName,

requestedUser.ipEndPoint.Address.ToString(),

requestedUser.ipEndPoint.Port);

return;

}

}

}

//Клиент одобрил подключение

private void ConnectToClientSuccess(Connection connection)

{

// кому одобряем подключение

User requestingUser = SocketReader.ReadUserRecord(connection.socket);

foreach (Connection _connection in connections)

{

// нашли

if (_connection.userNickName == requestingUser.nickName)

{

// посылаем сообщение об одобрении

SendMessage(_connection, Messages.ConnectToClientSuccess);

// записываем порт, адрес и имя

SocketWriter.WriteUserRecord(_connection.socket, connection.userNickName,

requestingUser.ipEndPoint.Address.ToString(),

requestingUser.ipEndPoint.Port);

return;

}

}

}

//Клиент не одобрил подключение

private void ConnectToClientFailed(Connection connection)

{

/ кому не одобряем

String requestingUser = SocketReader.ReadString(connection.socket);

foreach (Connection _connection in connections)

{

// нашли

if (_connection.userNickName == requestingUser)

{

// посылаем сообщение об отказе

SendMessage(_connection, Messages.ConnectToClientFailed);

return;

}

}

}

// запрос на отключение

private void DisconnectRequest(Connection connection)

{

// от кого отключаемся

String requestingUser = SocketReader.ReadString(connection.socket);

// информацию в log

logWriter.WriteToLogFile("Запрос на отключение от пользователя " + connection.userNickName + " пользователю " + requestingUser);

foreach (Connection _connection in connections)

{

// нашли

if (_connection.userNickName == requestingUser || _connection.userNickName == connection.userNickName)

{

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

SendMessage(_connection, Messages.DisconnectRequest);

//return;

}

}

}

//Клиент прислал запрос авторизации

private bool Authorization(Connection connection)

{

String userPassword = SocketReader.ReadString(connection.socket);

User user = SocketReader.ReadUserRecord(connection.socket);

logWriter.WriteToLogFile("Авторизация пользователя " + user.nickName);

//Проверяем пароль

if (userPassword != password)

{

SendMessage(connection, Messages.AuthorizationFailed);

SendMessage(connection, Messages.WrongPassword);

logWriter.WriteToLogFile("Авторизация пользователя " + user.nickName + " неуспешна. Неправильный пароль: "+ userPassword);

connections.Remove(connection);

return false;

}

//Проверяем на наличие такого имени

foreach (User _user in users)

{

if (_user.nickName == user.nickName)

{

SendMessage(connection, Messages.AuthorizationFailed);

SendMessage(connection, Messages.WrongName);

logWriter.WriteToLogFile("Авторизация пользователя " + user.nickName + " неуспешна. Неправильное имя пользователя.");

connections.Remove(connection);

return false;

}

}

//Если все удачно, добавляем пользователя

users.Add(user);

SendMessage(connection, Messages.AuthorizationSuccess);

logWriter.WriteToLogFile("Авторизация пользователя " + user.nickName + " прошла успешно");

connection.userNickName = user.nickName;

//Передаем список имен

SocketWriter.WriteInt(connection.socket, connections.Count);

foreach (Connection _connection in connections)

{

SocketWriter.WriteString(connection.socket, _connection.userNickName);

}

//Посылаем всем пользовтелям сообщение об авторизации нового пользователя

foreach (Connection _connection in connections)

{

if (connection != _connection)

{

SendMessage(_connection, Messages.ClientConnected);

SocketWriter.WriteUserRecord(_connection.socket, user);

}

}

return true;

}

//Отключение пользователя

private void DisconnectUser(Connection connection)

{

/Удаляем пользователя из списка

foreach (User user in users)

{

if (connection.userNickName == user.nickName)

{

users.Remove(user);

logWriter.WriteToLogFile("Пользователь " + connection.userNickName + " отключился");

break;

}

}

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

foreach (Connection _connection in connections)

{

if (_connection != connection)

{

SendMessage(_connection, Messages.ClientDisconnected);

SocketWriter.WriteString(_connection.socket, connection.userNickName);

}

}

connection.socket.Shutdown(SocketShutdown.Both);

connection.socket.Close();

connections.Remove(connection);

}

private void SendMessage(Connection connection, Messages messageType)

{

SocketWriter.WriteType(connection.socket, (byte)messageType);

}

}

}

Клиент:

namespace Client

{

public delegate void NeedListRedraw();

public delegate void EmptyHandler();

class Client

{

frmClient form; // форма

String nickName; // имя

String password;// пароль

Socket socket; // сокет

Thread mainThread; // главный поток

public String connectedUser = ""; // подключенный пользоваетель

public List<String> connectedUsers;// список пользователей

AudioTransceiver audiotransceiver;// объект класса для работы со звуком

// конструктор сласса

public Client(String _nickName, String _password, frmClient _form)

{

nickName = _nickName;

password = _password;

form = _form;

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

connectedUsers = new List<string>();

}

// получаем имя

public String GetUserName()

{

return nickName;

}

// подключаемся

public void Connect(String hostName)

{

//Подключаемся к серверу

socket.Connect(hostName, 11000);

//получаем порт и адресс конечной точки

int port = ((IPEndPoint)socket.LocalEndPoint).Port - 1000;

IPAddress ipAddress = ((IPEndPoint)socket.LocalEndPoint).Address;

// создаем звук))

audiotransceiver = new AudioTransceiver(ipAddress, port);

//сообщение об авторизации

byte messageType = (byte)Messages.AuthorizationRequest;

//записываем в сокет запрос

SocketWriter.WriteType(socket, (byte)messageType);

// записываем пароль

SocketWriter.WriteString(socket, password);

// записываем пользователя

User userToWrite = new User(nickName, new IPEndPoint(ipAddress, 11100));

SocketWriter.WriteUserRecord(socket, userToWrite);

audiotransceiver.AudioEndHandler = new EmptyHandler(AudioEnd);

// запускаем поток обработки

mainThread = new Thread(MainThread);

mainThread.IsBackground = true;

mainThread.Start();

}

void AudioEnd()

{

}

// отключение

public void Stop()

{

try

{ // сообщение о выходе

SocketWriter.WriteType(socket, (byte)Messages.IQuit);

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

socket.Disconnect(false);

// уничтожаем аудио

if (audiotransceiver != null)

audiotransceiver.Dispose();

// завершаем поток

mainThread.Abort();

}

catch { }

}

void MainThread()

{

try

{

while (true)

{

// читаем тип сообщения и выполняем то что просят

byte messageType = SocketReader.ReadType(socket);

switch (messageType)

{

//если запрос на авторизацию отконили

case (byte)Messages.AuthorizationFailed:

{ // то читаем что нам ответили и выводим соответсвтенно

messageType = SocketReader.ReadType(socket);

if (messageType == (byte)Messages.WrongPassword)

{

MessageBox.Show("Неверный пароль");

form.Invoke(form.disconnect);

}

else if (messageType == (byte)Messages.WrongName)

{

MessageBox.Show("Пользователь с таким именем уже есть в сети");

form.Invoke(form.disconnect);

}

break;

} // авторизация успешна

case (byte)Messages.AuthorizationSuccess:

{

// читаем кол во пользователей

int userNum = SocketReader.ReadInt(socket);

// добавляем в список пользователей

or (int i = 0; i < userNum; i++)

{

connectedUsers.Add(SocketReader.ReadString(socket));

}

//прорисовывваем

form.Invoke(form.redrawList);

break;

}

case (byte)Messages.ClientConnected:

{ // к нам подключились

NewClientConnected();

form.Invoke(form.redrawList);

break;

}

case (byte)Messages.ClientDisconnected:

{ // отключ

ClientDisconnected();

form.Invoke(form.redrawList);

break;

}

case (byte)Messages.ConnectToClientRequest:

{ // запрос на подключение к клиенту

ConnectToClientRequest();

form.Invoke(form.redrawList);

break;

}

case (byte)Messages.ConnectToClientSuccess:

{ // одобрили подключение

ConnectToClientSuccess();

form.Invoke(form.redrawList);

break;

}

case (byte)Messages.ConnectToClientFailed:

{ // отклонили

ConnectToClientFailed();

form.Invoke(form.redrawList);

break;

}

case (byte)Messages.DisconnectRequest:

{ // запрос на отключение

connectedUser = "";

form.Invoke(form.redrawList);

DisconnectAudio();

break;

}

case (byte)Messages.ServerClose:

{ // при отключении сервера

MessageBox.Show("Сервер отключен. Соединение прервано.");

DisconnectAudio();

form.Invoke(form.disconnect);

return;

}

}

}

}

catch (ThreadAbortException e)

{

}

catch (Exception e)

{

MessageBox.Show("Соединение будет закрыто." + e.Message);

Stop();

}

}

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

void ConnectToClientRequest()

{ // кто подключается

User requestingUser = SocketReader.ReadUserRecord(socket);

// разрешили подключаться

if (MessageBox.Show("Пользователь " + requestingUser.nickName + " хочет осуществить подключение к вам. Одобрить подключение?", "Запрос на подключение", MessageBoxButtons.YesNo) == DialogResult.Yes)

{ // пишем что разрешили

SocketWriter.WriteType(socket, (byte)Messages.ConnectToClientSuccess);

// пишем пользователя адресс и порт

SocketWriter.WriteUserRecord(socket, requestingUser.nickName,

audiotransceiver.GetEndPoint().Address.ToString(),

audiotransceiver.GetEndPoint().Port);

// имя того,кто подключается

connectedUser = requestingUser.nickName;

// начинаем передачу

audiotransceiver.Connect(requestingUser.ipEndPoint);

audiotransceiver.BeginTransceiving();

}

// если отклонили

else

{

// оповещаем об этом

SocketWriter.WriteType(socket, (byte)Messages.ConnectToClientFailed);

//пишем имя того кому отказали

SocketWriter.WriteString(socket, requestingUser.nickName);

}

}

// если одобрили подкючение

void ConnectToClientSuccess()

{ // от кого принимаем

User user = SocketReader.ReadUserRecord(socket);

// начинаем прием

audiotransceiver.Connect(user.ipEndPoint);

audiotransceiver.BeginTransceiving();

connectedUser = user.nickName;

}

// отклонили подключение

void ConnectToClientFailed()

{

MessageBox.Show("Пользователь отверг подключение");

}

// разрываем передачу аудио

public void DisconnectAudio()

{

//if (!iStopped)

//MessageBox.Show("Пользователь " + connectedUser + " прекратил передачу аудио");

//connectedUser = "";

/*Object thisLock = new Object();

lock (thisLock)

{*/

try

{

if (audiotransceiver != null)

{

audiotransceiver.EndTransceiving();

//audiotransceiver.Dispose();

}

}

catch

{

}

// }

}

// кто то новый появился

void NewClientConnected()

{

// читаем его имя

User user = SocketReader.ReadUserRecord(socket);

// добавляем его в список

connectedUsers.Add(user.nickName);

form.Invoke(form.redrawList);

}

// кто то отключился

void ClientDisconnected()

{

//Читаем имя отсоединившегося пользователя

String name = SocketReader.ReadString(socket);

//Удаляем его из списка

connectedUsers.Remove(name);

}

// запос на подключение

public void SendConnectRequest(String userName)

{

// посылаем запрос

SocketWriter.WriteType(socket, (byte)Messages.ConnectToClientRequest);

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

SocketWriter.WriteUserRecord(socket, userName,

audiotransceiver.GetEndPoint().Address.ToString(), audiotransceiver.GetEndPoint().Port);

}

//запрос на отключение

public void SendDisconnectRequest(String userName)

{

// посылаем запрос

SocketWriter.WriteType(socket, (byte)Messages.DisconnectRequest);

// пишем имя от кого хоти отключиться

SocketWriter.WriteString(socket, userName);

//EndTranslation1();

}

}

}

Размещено на Allbest.ru

...

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

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

    курсовая работа [1,2 M], добавлен 28.04.2014

  • Сетевое программное обеспечение: общее понятие, содержание, функции. Этапы развития теории компьютерных сетей. Проектирование в среде программирования Borland Builder C++ клиент серверного приложения с использованием сокетов, листинг данной программы.

    курсовая работа [191,5 K], добавлен 07.01.2015

  • Разработка системы, базирующейся на протоколе LIMone, для обмена мгновенными сообщениями и пересылки файлов в процессе деловой переписки. Реализация системы в виде клиент-серверного приложения. Расчет экономических показателей программного продукта.

    дипломная работа [4,7 M], добавлен 22.08.2016

  • Изучение истории достижений корпорации Oracle. Разработка клиент-серверного приложения на языке Delphi XE, реализующего возможность управления персоналом на предприятии. Основные структуры данных. Создание инструкции работы с приложением "Отдел кадров".

    дипломная работа [974,7 K], добавлен 08.06.2013

  • Анализ технологий, применяемых для построения современных ЛВС. Моделирование функционирования локальной вычислительной сети по технологии Fast Ethernet. Разработка клиент-серверного приложения и программного обеспечения, работающего в сети APMов.

    курсовая работа [2,0 M], добавлен 23.11.2011

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

    курсовая работа [352,0 K], добавлен 24.08.2016

  • Многоуровневые архитектуры клиент–сервер. Диаграммы классов, реализующих уровни презентации, бизнес–логики и базы данных приложения. Словесное описание процесса выполнения транзакций. Создание, изменение и удаление хранимых процедур, их выполнение.

    курсовая работа [3,4 M], добавлен 23.03.2013

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

    курсовая работа [1,3 M], добавлен 28.04.2014

  • Основные концепции разработки приложения в архитектуре MVVM. Проектирование базы данных, предназначенной для сбора информации о дорожно-транспортных происшествиях. Классификация и типы архитектуры "клиент–сервер", ее основные достоинства и недостатки.

    курсовая работа [4,1 M], добавлен 25.11.2015

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

    курсовая работа [942,1 K], добавлен 19.03.2012

  • Выбор спецификации активного и пассивного сетевого оборудования локальной вычислительной сети. Расчет количества кабеля и кабель-каналов. Выбор операционной системы рабочих станций. Настройка серверного, активного сетевого и серверного оборудования.

    курсовая работа [2,5 M], добавлен 18.05.2021

  • Разработка конфигурации службы. Исследование вычислительной эффективности алгоритма оптимизации. Программная реализация клиент-серверного приложения. Алгоритм решения непрерывной задачи загрузки рюкзака. Подключение веб-сервиса к клиентскому приложению.

    курсовая работа [1,4 M], добавлен 21.01.2017

  • Основные концепции разработки приложения в трёхуровневой архитектуре. Проектное решение, реализующее модель реляционной БД. Спецификация на разработку интерфейса. Описание выполнения транзакций прибытия и убытия судна. Инсталляционные файлы приложения.

    курсовая работа [4,0 M], добавлен 26.12.2011

  • Характеристика подходов к построению CRM-систем. Разработка клиент-серверного приложения, которое предоставляет возможность управления взаимоотношениями с клиентами на платформе ASP.NET Web Froms. Проработка некоторых аспектов безопасности CRM-систем.

    курсовая работа [686,2 K], добавлен 24.04.2015

  • Характеристика разновидностей программной реализации чатов. Разработка программы клиент-серверного чата с возможность общения в локальной сети нескольких человек одновременно. Протокол взаимодействия клиента и сервера. Порядок работы с программой.

    курсовая работа [530,7 K], добавлен 25.04.2015

  • Создание клиент-серверного приложения "Чат" с помощью среды визуальной разработки приложений Borland C++ Builder версии 6. Описание функциональности приложения: наличие клиент-серверной архитектуры, обмен короткими сообщениями, а также передача файлов.

    курсовая работа [302,0 K], добавлен 30.01.2012

  • Проектирование локальной вычислительной сети для предприятия c главным офисом в центре города и двумя филиалами на удалении не более 1,5 км. Выбор топологии сети и основного оборудования. Программное обеспечение для клиент-серверного взаимодействия сети.

    курсовая работа [3,4 M], добавлен 27.02.2015

  • Разработка клиент-серверного приложения на основе TCP\IP соединения. Организация работы удаленного генератора псевдослучайных последовательностей. Описание основных функциональных модулей. Интерфейс пользователя, сетевое взаимодействие и алгоритм.

    курсовая работа [223,6 K], добавлен 18.10.2013

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

    дипломная работа [2,7 M], добавлен 07.07.2012

  • Работы по созданию сети ARPANET, протоколы сетевого взаимодействия TCP/IP. Характеристика программного обеспечения для TCP/IP. Краткое описание протоколов семейства TCP/IP с расшифровкой аббревиатур. Архитектура, уровни сетей и протоколы TCP/IP.

    реферат [15,7 K], добавлен 03.05.2010

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