Разработка программы «Сетевой чат»
После того как пользователь запустил программу-сервер и сам сервер, создается объект класса Server, у которого есть слушающая функция, которая слушает сокет и ждет новых клиентов, когда подключается новый клиент, создается объект класса Client, который помещается в коллекцию. Данную коллекцию подключенных клиентов и обрабатывает сервер. Объекты Client из коллекции осуществляют взаимодействие… Читать ещё >
Разработка программы «Сетевой чат» (реферат, курсовая, диплом, контрольная)
Сегодня на дворе 21 век — век информационных технологий, которые стремительно развиваются каждую секунду нашей жизни. Технологический, а также информационный прогресс, особенно за последние годы, сделал огромный шаг вперед. Современное человечество быстро превращается в информационное общество, а в особенности это происходит в быстроразвивающихся странах, которые делают большой упор именно на развитие техники и информационных технологий.
У многих людей есть компьютеры, будь то настольные персональные компьютеры, ноутбуки или карманные ПК, а также доступ во всемирную сеть Интернет с огромных количеством развлекательных и интересных ресурсов, либо в локальную сеть, которая наполнена различными развлекательными сервисами. Соответствено, люди знакомятся и становиться возможным общение на расстоянии, чтобы облегчить эту задачу, в наше время существует очень много решений, данный диплом был посвящен разработке средства общения между людьми в реальном времени на расстоянии.
Обоснование выбора языка программирования
Для решения поставленной задачи была выбрана интегральная среда разработки (ИСР) Microsoft Visual Studio.NET поскольку:
— в ней доступны широкие возможности языка C#
— используется широким кругом программистов-профессионалов, разрабатывающих в ОС Windows
— она имеет все необходимые средства и инструменты для разработки приложений любой сложности
— удобна в использовании, гибка в настройке
— создает очень эффективный код
— в ней имеется возможность использования готовых библиотек классов
— позволяет импортировать исходный код и проекты для ИСР других ОС
Так как ИСР выбрана Microsoft Visual Studio.NET, соответственно языком программирования выбран C#, поскольку:
— «родной» язык для создания приложений в среде .NET
— подлинная объектная ориентированность (всякая языковая сущность претендует на то, чтобы быть объектом)
— компонентно-ориентированное программирование
— безопасный (по сравнению с языками C и C++) код
— унифицированная система типизации
— поддержка событийно-ориентированного программирования
— объединение лучших идей современных языков программирования: Java, C++, Visual Basic и др.
При разработке данного проекты было принято решение создать кроссплатформенный клиент для чата, который был реализован в Microsoft Visual Studio.NET, после чего был импортирован в MonoDevelop и реализован клиент для ОС Ubuntu. Для компиляции клиента под ОС Ubuntu выбрана ИСР MonoDevelop, поскольку она полностью соответствует возможностям Microsoft Visual Studio.NET.
интегральный система microsoft компьютер
Описание инструмента разработки программы
Интегрированная среда разработки (Integrated Development Environment, IDE) Microsoft Visual Studio .NET является последней по времени выпуска версией популярной и широко используемой среды разработки профессионального программного обеспечения (ПО) производства компании Microsoft.
Объединяя в своем составе все положительные стороны предыдущих версий, данная обеспечивает возможность использования всех преимуществ современной технологии Microsoft .NET. В числе основных достоинств MS VS .NET, подостоинству оцененных сообществом профессиональных программистов, можно отметить следующие моменты:
* Повышение производительности труда разработчиков — Среда разработки Visual Studio .NET продолжает традиции корпорации icrosoft в области предоставления эффективных инструментальных средств для разработчиков сложного ПО. Обеспечивая среду разработки для всех языков программирования, дополненную набором окон с интуитивно понятными инструментальными средствами, контекстной справкой и автоматизированными механизмами выполнения разнообразных задач разработки, Visual Studio .NET позволяет в сжатые сроки проводить профессиональную разработку программ различного назначения;
* Поддержка нескольких языков программирования — В большинстве профессиональных групп разработчиков, как правило, используется несколько языков программирования — для поддержки такой практики в Visual Studio .NET впервые была обеспечена возможность использования сразу нескольких языков в рамках одной и той же среды. Благодаря применению общего конструктора для компонентов, для форматов XML и HTML, а также наличию единого отладчика, Visual Studio .NET предоставляет разработчикам эффективные средства, независимые от языка программирования. Разработчикам ПО при использовании Visual Studio .NET уже не придется ограничиваться одним языком программирования, адаптируя свою рабочую среду к особенностям этого языка. Более того, Visual Studio .NET позволяет программистам многократно использовать уже имеющиеся у них наработки, а также навыки разработчиков, создающих свои программы на разных языках программирования;
* Единая модель программирования для всех приложений — При создании приложений ранее разработчикам приходилось использовать различные приемы программирования, которые существенным образом зависели от типа приложения — технологии разработки клиентского программного обеспечения, общедоступных веб-приложений, программного обеспечения для мобильных устройств и бизнес-логики промежуточного уровня значительно различались между собой. Среда разработки Visual Studio .NET решает данную проблему, предоставляя в распоряжение разработчиков единую модель создания приложений всех категорий. Эта интегрированная модель обладает привычным и одновременно интуитивно понятным интерфейсом, позволяя разработчикам использовать свои навыки и знания для эффективного создания широкого спектра приложений,
* Всесторонняя поддержка жизненного цикла разработки — Среда Visual Studio .NET обеспечивает поддержку всего жизненного цикла разработки: начиная с планирования и проектирования через разработку и тестирование и вплоть до развертывания и последующего управления. Обеспечивая возможность легкого расширения среды разработки посредством включения продуктов независимых разработчиков, Visual Studio .NET предоставляет всестороннюю адаптируемую среду для создания всех приложений, жизненно необходимых для успешной работы современных компаний.
Описание разработанного приложения
Программа «Сетевой чат» является сетевой программой, поэтому она состоит из двух частей: программы-сервера и программы-клиента.
Программа-клиент представляет собой приложение, которое позволяет пользователю отправлять другим собеседникам сообщения и файлы, а также проматривать сообщения, отправленные другими собеседниками, данное приложение посредством разработанного протокола обменивается данными с программой сервером.
Программа сервер выполняет роль связующего модуля между клиентами, посредством разработанного протокола реализует беседу в реальном времени, следит за состоянием программ-клиентов. Данное приложение устанавливается на главные компьютер локальной сети, если общение просходит в ее рамках, либо на доступные ресурс в интернете. База данных пользователей хранится на машине, где установлена программа-сервер.
Когда к серверу подключается клиент, в общую комнату выводится сообщение и происходит обновление списка собеседников у подключенных клиентов, новый клиент может видеть сообщения только с момента подключения. При отключении клиента ситуация аналогична.
Подключенные клиенты могут общаться в общей публичной комнате в редиме реального времени, но также существует возможность общения в приватной комнате, т. е. только между двумя собеседниками.
Для соединения клиент-сервер использует TCP протокол, так как необходимо надежное соединение, в таком случае можно быть уверенным, что сообщение будет доставлено.
Программа-клиент использует шифрование паролей пользователей, программа-сервер хранит защфрованные пароли в БД MySQL, что повышает уровень защиты. Базы данных хранятся на серверной машине или на другом сервере, зависит от организации администатором сервера.
После запуска программы-клиента пользователь выбирает сервер для подключения, после подключения пользователь видит список доступных собеседников и модет начинать общение, либо просто наблюдать за беседой.
Описание использованных технологий. Язык программирования C#
Для разработки приложений был использован язык программирования C#, (произносится си-шарп, иногда переводят си-диез) — объектно-ориентированный язык программирования. Разработан в 1998—2001 годах группой инженеров под руководством Андерса Хейлсберга в компании Microsoft как основной язык разработки приложений для платформы Microsoft .NET Framework и впоследствии был стандартизирован как ECMA-334 и ISO/IEC 23 270. Компилятор C# входит в стандартную установку .NET Framework.
C# относится к семье языков с C-подобным синтаксисом, из них его синтаксис наиболее близок к C++ и Java. Язык имеет статическую типизацию, поддерживает полиморфизм, перегрузку операторов (в том числе операторов явного и неявного приведения типа), делегаты, атрибуты, события, свойства, обобщённые типы и методы, итераторы, анонимные функции с поддержкой замыканий, LINQ, исключения, комментарии в формате XML.
Переняв многое от своих предшественников — языков C++, Java, Delphi, Модула и Smalltalk — С#, опираясь на практику их использования, исключает некоторые модели, зарекомендовавшие себя как проблематичные при разработке программных систем, например, C# не поддерживает множественное наследование классов (в отличие от C++).
MySQL и язык запросов SQL
MySQL («май-эс-кью-эль») — свободная система управления базами данных (СУБД). MySQL является собственностью компании Oracle Corporation, получившей её вместе с поглощённой Sun Microsystems, осуществляющей разработку и поддержку приложения. Распространяется под GNU General Public License или под собственной коммерческой лицензией. Помимо этого разработчики создают функциональность по заказу лицензионных пользователей, именно благодаря такому заказу почти в самых ранних версиях появился механизм репликации.
MySQL является решением для малых и средних приложений. Входит в состав серверов WAMP, LAMP и в портативные сборки серверов Денвер, XAMPP. Обычно MySQL используется в качестве сервера, к которому обращаются локальные или удалённые клиенты, однако в дистрибутив входит библиотека внутреннего сервера, позволяющая включать MySQL в автономные программы.
Гибкость СУБД MySQL обеспечивается поддержкой большого количества типов таблиц: пользователи могут выбрать как таблицы типа MyISAM, поддерживающие полнотекстовый поиск, так и таблицы InnoDB, поддерживающие транзакции на уровне отдельных записей. Более того, СУБД MySQL поставляется со специальным типом таблиц EXAMPLE, демонстрирующим принципы создания новых типов таблиц. Благодаря открытой архитектуре и GPL-лицензированию, в СУБД MySQL постоянно появляются новые типы таблиц.
SQL это язык, ориентированный специально на реляционные базы данных (РБД). Он выполняет большую работу, которую вы должны были бы делать, если бы использовали универсальный язык программирования, например C. Чтобы сформировать РБД на C, вам необходимо было бы начать с нуля. Вы должны были бы определить объект, называемый таблицей, которая могла бы увеличиваться, чтобы иметь любое число строк, а затем создавать постепенно процедуры для вставки и извлечения значений.
Команды в SQL могут работать со всеми группами таблиц как с единым объектом и могут обрабатывать любое количество информации, извлечённой или полученной из них в виде единого модуля.
Описание алгоритма MD5(RFC1321)
Алгоритм MD5 является алгоритмом вычисления «хэш-функции» (message digest) для различных целей — шифрование паролей, проверка целостности файлов, и т. д. На вход подается поток данных произвольной длины, а на выходе получаем хэш длиной 128 бит. Сила этого алгоритма заключается в том, что практически очень сложно, почти невозможно, найти две строки, дающие одинаковый хэш. Однако, при определенных условиях, возможно получение исходного текста. Но этот метод основан на определенном выборе начальных значений, поэтому не представляет практической ценности. Также MD5 алгоритм используется в приложениях криптографии и электронно-цифровых подписей для генерации ключа шифрования.
При разработке данного алгоритма принималось во внимание скорость работы на современных 32-разрядных системах, а также требование минимизации используемой памяти. По сравнению с MD4, MD5 более медленный (примерно на 15 процентов), чем MD4, но в то же время и более устойчивым, в силу особенностей построения.
Введем следующие обозначения: под «словом» будет подразумеваться количество информации в 32 бита, а под «байтом» — 8 бит. Последовательность бит будем рассматривать как последовательность байт, старший байт идет первым, младший — последним. Аналогично представляется последовательность байт, как последовательность слов, только младший байт идет первым.
На вход алгоритма подается входной поток данных длиной N.
N может быть произвольным целым неотрицательным числом. Это число может быть как кратным, так и нет, 8. Процесс вычисления MD5 суммы состоит из нескольких шагов. Рассмотрим их подробнее.
Шаг 1: выравнивание потока.
Процесс выравнивания заключается в дописывании в конец потока 1, а затем некоторого числа нулей. Нули добававляются до тех пор, пока длина всего потока не станет равной 512*N+448, т. е. равной 448 по модулю 512. Такое выравнивание происходит в любом случае, даже если длина потока уже удовлетворяет данному условию.
Шаг 2: добавление длины.
Затем в конец дописывается двоичное представление длины первоначального потока-всего 64 бита. Если же длина больше чем264, то берутся младшие 64 бита. Это добавление представляет собой два «слова», младшее идет первым, за ним старшее.
После этого суммарная длина потока станет кратной 16 32- битным словам.
Дальнейшее вычисления основываются на представлении этого расширенного потока как массива слов длины N: A[0, … N-1].
Шаг 3: инициализация MD буфера.
При вычислениях будет использоваться буфер из 4 слов — A, B, C, D, в котором хранятся результаты промежуточных вычислений. Начальные значения, находящиеся в этом буфере, следующие:
A = 0×67 452 301
B = 0xEFCDAB89
C = 0×98BADCFE
D = 0×10 325 476
Шаг 4: обработка потока блоками по 16 слов.
Для дальнейших вычислений нам необходимо ввести следующие функции, зависящие от 3 параметров-«слов». Результатом работы этих функций будет также «слово».
F (x, y, z) = (x & y) | (~x & z) G (x, y, z) = (x & z) | (y & ~z) H (x, y, z) = x ^ y ^ z I (x, y, z) = y ^ (x | ~z) | (4.1) | |
Здесь «&» обозначает побитовая операция «AND», «|» побитовая операция «XOR», «^» операция побитового «XOR», «~» операция побитового «NOT»
Таблица 4.1 — Таблица истинности функций F (x, y, z), G (x, y, z), H (x, y, z), I (x, y, z)
x | y | z | F | G | H | I | |
На этом этапе нам также понадобится таблица констант T[1…64], заполненная с помощью следующей формулы:
T[i] = [4 294 967 296 * abs (sin (i))] , | (4.2) | |
где [] есть операция взятия целой части.
Определим также операцию циклического сдвига слова X на Y:
X<< | (4.3) | |
Дальнейшее описание алгоритма, его основная часть, будет написано на псевдокоде.
// разбиваем поток на блоки по 16 слов:
for i = 0 to N/16 — 1 do
{
// i-й блок заносится в X
for j = 0 to 15 do
X[j] = M[i * 16 + j]
// Сохраняем значения A, B, C, D
AA = A
BB = B
CC = C
DD = D
// раунд 1
// [abcd k s i] обозначает операцию
// a = b + ((a + F (b, c, d) + X[k] + T[i]) <<< s)
// выполняется 16 операций:
[ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4]
[ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7 22 8]
[ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12]
[ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16]
// раунд 2
// [abcd k s i] обозначает операцию
// a = b + ((a + G (b, c, d) + X[k] + T[i]) <<< s)
// выполняется 16 операций:
[ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20]
[ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24]
[ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA 8 20 28]
[ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA 12 20 32]
// раунд 3
// [abcd k s i] обозначает операцию
// a = b + ((a + H (b, c, d) + X[k] + T[i]) <<< s)
// выполняется 16 операций:
[ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36]
[ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA 10 23 40]
[ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44]
[ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA 2 23 48]
// раунд 4
// [abcd k s i] обозначает операцию
// a = b + ((a + I (b, c, d) + X[k] + T[i]) <<< s)
// выполняется 16 операций:
[ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51] [BCDA 5 21 52]
[ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55] [BCDA 1 21 56]
[ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59] [BCDA 13 21 60]
[ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63] [BCDA 9 21 64]
A += AA
B += BB
C += CC
D += DD
}
Шаг 5: вывод MD5.
Окончательный результат, находящийся в буфере A-D, и есть почти готовый хэш. Выводя «слова» из этого буфера в обратном порядке, мы получим готовый хэш. Т. е. md5hash=DCBA.
Теперь о свойствах алгоритма в целом.
Для начала краткое описание отличий от MD4.
Различия между MD4 и MD5
Следующий список представляет собой различия между MD4 и MD5:
1. MD5 имеет на один раунд больше — 4 против 3 у MD4.
2. Что бы уменьшить влияние входного текста была введена уникальная константа для каждого раунда-T[i].
3. Во втором раунде заменили функцию g с (XY v XZ v YZ) на (XZ v Y not (Z)), для того, чтобы сделать g менее симметричной.
4. На каждом шаге используется значение, полученное на предыдущем шаге. Это дает более быстрое изменение результата при изменении входных данных.
5. Для этих же целей количество сдвигов различается от раунда к раунду, и выбрано так, что бы еще более увеличить этот эффект.
6. Изменен порядок, в котором обрабатываются слова в раундах 2 и 3, для того чтобы сделать их менее похожими друг на друга.
Скорость работы и производительность
Для того, что бы показать разницу в скорости MD4 и MD5, был проведен следующий эксперимент. Результаты занесены в таблицу.
Суть эксперимента заключается в том, что бы замерить время, затраченное на построение 10 000 хэшей от сообщения размером 10 000 байт.
Вычисления проводились на Intel Pentium III 750 МГц. В качестве двух реализаций были выбраны реализация из пакета
OpenSSL и основанная на RFC1321.
Таблица 4.2 — Сравнение алгоритмов MD4 и MD5
MD4 | MD5 | ||||
RFC | 2.574 сек | 37 940 кБ/сек | 2.614 сек | 37 359 кБ/сек | |
OpenSSL | 0.891 сек | 109 603 кБ/сек | 1.152 сек | 84 771 кБ/сек | |
Результаты исследования показывают, что:
* В реализации RFC MD5 медленнее MD4 на 1.55%.4.92%
* В реализации MD5 медленнее MD4 на 29.29%.39.82%
Но, тем не менее, в настоящее время MD5 используется гораздо шире, чем MD4. Это связано в первую очередь с повышенной надежностью первого.
Надежность
В 1996 году появилась статья, которая позволила некоторым авторам считать данный алгоритм взломанным. Основная идея такая: если бы была возможность задать произвольные начальные значения буфера MD5 (0×67 452 301, 0xEFCDAB89, 0×98BADCFE, 0×10 325 476), то тогда можно было бы подобрать два сообщения, которые не различаются, кроме, быть может, в нескольких разрядах, таких, что для них может быть построен один и тот же дайджест. Математически это выражается так: MD5(IV, M1) = MD5(IV, M2),
где IV = Initial Values = начальные значения, M1 и M2 два разных сообщения.
Автор данного сообщения, Hans Dobbertin, нашел, что если в качестве начальных значений буфера использовать A = 0×12AC2375, B = 0x3B341042, C = 0x5F62B97C, D = 0x4BA763ED, и задать содержимое блока данных для преобразования следующим образом:
X0 = 0xAA1DDABE, X1 = 0xD97ABFF5, X2 = 0xBBF0E1C1,
X3 = 0×32 774 244, X4 = 0×100 6363E, X5 = 0×721 8209D,
X6 = 0xE01C136D, X7 = 0x9DA64D0E, X8 = 0×98A1FB19,
X9 = 0x1FAE44B0, X10 = 0×236BB992, X11 = 0x6B7A779B,
X12 = 0×1326ED65, X13 = 0xD93E0972, X14 = 0xD458C868,
X15 = 0x6B72746A.
Тогда второе сообщение строится из первого по такой формуле:
(4.4) | ||
Тогда
MD5(IV, X) = MD5(IV, X') = BF90E670752AF92B9CE4E3E1B12CF8DE | (4.5) | |
Стойкость к нахождению коллизий
Нахождению коллизий препятствует быстрый обвал выходной функции. К примеру, рассмотрим два хэша от двух сообщений, различающихся в одном бите:
MD5(abc) = 90 015 0983CD24FB0D6963F7D28E17F72 | (4.6) | |
MD5(acc) = 167 3448EE7064C989D02579C534F6B66 | (4.7) | |
Отсюда хорошо видно, что выходные значения отличаются значительно. Полный перебор же — занятие бессмысленное, так как при имеющихся скоростях порядка 100 Мб/сек, полный перебор занял бы около 1062 лет, и при этом потребовал бы 2230 Гб места.
Так что MD5 по праву считается надежным алгоритмом.
Описание разработанных компонентов программы. Описание базы данных
При реализации данного проекта было решено использовать базу данных MySQL, поскольку:
— предполагается дельнейшее развитие проекта
— наиболее распространенная и простая в использовании БД
— возможно использование уже существующего сервера
— используется язык SQL (достаточно прост и удобен)
Описание структуры базы данных.
В проекте используется только одна база с одной таблицей, в которой хранятся имя пользователя и хеш его пароля.
Таблица 4.3 — Представление таблицы данных users:
login | |
pass | |
Создание базы данных DatabaseKAChat, таблицы users:
str = «CREATE DATABASE DatabaseKAChat ON PRIMARY «+
" (NAME = DatabaseKAChat_Data, «+
" FILENAME = 'Database.mdf', «+
" SIZE = 3MB, MAXSIZE = 10MB, FILEGROWTH = 10%) «+
" LOG ON (NAME = DatabaseKAChat_Log, «+
" FILENAME = 'DatabaseLog.ldf', «+
" SIZE = 1MB, «+
" MAXSIZE = 5MB, «+
" FILEGROWTH = 10%)" ;
myConn.Open ();
myCommand.ExecuteNonQuery ();
str1 = «CREATE TABLE users» +
" (login NVARCHAR (25), pass NVARCHAR (100))" ;
myConn = new SqlConnection (connectionString);
myCommand = new SqlCommand (str1, myConn);
myConn.Open ();
myCommand.ExecuteNonQuery ();
Поскольку в данном проекте проводится всего несколько операций работы с БД, не целесообразно выделять отдельный класс для этого, код вставляется последовательно в проект.
Описание протокола передачи данных
Любая сетевая программа имеет свой протокол передачи данных. В данном случае был разработан достаточно простой протокол обмена данными между клиентом и сервером, поскольку обмен данными между программами происходит на простом уровне и в очень малом объеме.
Клиента и сервер обмениваются данными в виде сообщений, каждое из которых представляет собой текстовую строку, оканчивающуюся символом перевода строки.
Таблица 4.4 — Команды клиента
Команда | Описание | |
guest | Подключиться к серверу как гость guest n | |
autorization | Авторизоваться на сервере autorization n | |
register | Зарегистрировать на сервере register n | |
sendall | Отослать всем sendall n | |
send | Отправить в приватную комнату send n | |
filerequest | Передача файла filerequest n | |
accept | Подтвердить прием файла accept n | |
deny | Отказать в передаче файла deny n | |
disconnect | Отключиться от сервера | |
Таблица 4.5 — Команды сервера:
list | Отправить список собеседников list … n | |
broadcast | Вывод информации/сообщения в общую комнату broadcast n | |
disconnect | Отключение сервера | |
message | Приватное сообщение собеседнику message n | |
backmessage | Приватное сообщение отправителю backmessage n | |
filerequest | Ответ на запрос передачи файла | |
Из приведенного списка команд видно, что протокол является узкоспециальным и предназначен только для данного проекта. С другой стороны, разработка универсального протокола передачи данных является нетривиальной задачей, требующей огромных затрат.
Пример работы по протоколу (К — клиент, С — сервер):
К: guest guest4356 — запрос на подключение
C: list … < guest4356> - подключение прошло удачно, сервер рассылает всем новый список собеседников
С: broadcast «—- guest4356 вошел в чат —- «
К: sendall «Привет всем!!!»
С: usern «broadcast» «Привет всем»
К: «» — клиент отключился
С: broadcast «—- guest4356 покинул чат —- «
С: list … — сервер рассылает всем новый список собеседников
С: «» — сервер остановлен
Программа-сервер
Программа выполняет следующие функции:
— Авторизация/регистрация пользователей
— Передача сообщений от одного пользователя в общую комнату
— Перелача сообщений от пользователя в приватную комнату
— Передача запроса на передачу файла от одного пользователя к другому
— Контролирует подключение/отключение клиентов
— Логирование работы сервера и общения, подключения/отключения пользователей
При реализации интерфейса программы были использован класс WindowsForms. Так же для упрощения разработки были использованы уже готовые реализованные классы.
Описание разработанных классов
Класс «Client»
class Client
{
//события приема данных от клиента
public event DataReceivedEventHandler DataReceived;
//событие при отключении клиента
public event DisconnectedEventHandler Disconnected;
private Thread foneListener; //слущающий поток
private Socket socket; //сокет для подключения
private string name; //имя пользователя
public bool disconnected; //флаг подключения клиента
public Client (Socket socket); //конструктор клиента
public void connectUser (); //подключение пользователя
//функция, которая слушает сокет
private void ListeningFunction ();
//обработка команд от подключенных клиентов
private void Parse (string str);
public string Receive (); //Прием сообщения
//Авторизация подключившегося клиента
private string Auth (string str);
//отправить сообщение клиенту
public void Send (string str);
//отключение клиента
public void Disconnect (string str);
}
В классе «Client» реализуется подключение клиента к серверу, при подключении нового клиента, на сервере создается новый обьект Client. У нового объекта есть свой сокет, через который он общается с подключившимся клиентом, и есть слушающая функция, чтобы обрабатывать данные, которые приходят от подключенного клиента.
Класс «Server».
public class Server
{
private Thread bgListener; //поток, слушающий клиентов
private Socket listenerSocket; //сокет для клиентов
private List clients; //список подключенных клиентов
private int serverPort; //порт для подключения
public bool running; //флаг запущен сервер или нет
public Server (int port); //конструктор сервера
public void Start (); //запуск сервера
public void Stop (); //останов сервера
//запуск потока, слушающего клиентов
private void StartToListen ();
//добавить нового клиента
private void CreateNewClient (Socket socket);
// проверка корректности ника при подключении
private bool NickIsIncorrect (string str);
//обработка команд, приходящих от сервера
// executing received command
// args[0] - sender name
// args[1] - command
// args[2] - target name
// args[3] - parameter. Usually, message text
private void CommandRun (string[] args);
private void SendList (); //рассылка списка собеседников
//оброаботка отключившегося клиента
private void ClientDisconnected (string disconnectedUser);
//рассылка информационного сообщения/сообщения в общую комнату
private void BroadcastMessage (string sender, string str);
//отослать сообщение в приватную комнату
private void SendTo (string sender, string target, string str);
//отослать сообщение в приватную комнату отправителю
private void SendBack (string sender, string target, string str);
//обработка передачи файла
private void SendRequestResult (string sender, string target, string str);
//функция логирования работы сервера
public void AddToLog (string str);
}
Класс «Server» основной в программе, в нем хранится коллекция объектов подключенных клиентов (Client), в данном классе реализуется обмен данными между подключенными клиентами, обработка подключения/отключения клиентов.
Класс «MainForm»
public partial class MainForm: Form
{
private Server brain; //указатель на обьект Server
public MainForm (Server serv); //конструктор главной формы
//запуск сервера
private void startButton_Click (object sender, EventArgs e);
//останов сервера
private void stopButton_Click (object sender, EventArgs e);
//завершение работы сервера
private void MainForm_FormClosing (object sender, FormClosingEventArgs e);
//спрятать/развернуть окно сервера с трей (панель радом с //часами)
private void MainForm_Resize (object sender, EventArgs e);
//обработка разворачивания окна из трея
private void notifyIcon1_MouseClick (object sender, MouseEventArgs e)
//закрыть главное окно, корректно завершить работу сервера
private void exitButton_Click (object sender, EventArgs e);
//показать лог работы сервера
private void logButton_Click (object sender, EventArgs e);
}
Класс «MainForm» реализует взаимодействие пользователя с интерфейсом программы.
После того как пользователь запустил программу-сервер и сам сервер, создается объект класса Server, у которого есть слушающая функция, которая слушает сокет и ждет новых клиентов, когда подключается новый клиент, создается объект класса Client, который помещается в коллекцию. Данную коллекцию подключенных клиентов и обрабатывает сервер. Объекты Client из коллекции осуществляют взаимодействие через сокет непосредственно с с подключенными к серверу клиентами, они принимают команды, передают их объекту Server, который в свою очередь обрабатывает полученную команду и производит ответные действия. Объект класса MainForm созданный при запуске программы-сервера, реализуется взаимодействие интерфейса программы с объектом класса Server/
Программа-клиент
Класс «Client»
public class Client
{
private Thread bgListener; //слушающий поток
private TcpClient socket; //сокет клиента
private bool connected; //флаг подключения
public string name; //имя пользователя
//события, срабатывающее при поступлении данных
public event DataReceivedEventHandler DataReceived;
public Client (); //конструктор клиента
//подключение и аторизация на сервере
public bool Connect (string ServerIP, string login, string pass);
//регистрация на сервере
public bool Register (string ServerIP, string login, string pass);
//функция, принимающая данные от сервера
private void ListeningFunction ();
public void Send (string str); //отправка сообщений серверу
public void Disconnect (); //отключение от сервера
public bool Connected (); //проверка статуса подключения
}
Класс «Client» реализует взаимодействие и обмен данными с сервером.
Класс «Controller»
public class Controller
{
private Client chat; //указатель на обьект Client
private MainForm mainForm; //указатель на главную форму
private FileTrasferer transferer; //обьект для передачи файла
private string filename; //имя передаваемого файла
private string transferUser; //кому передавать файл
private long fileSize; //размер файла
private Stream stream; //поток чтени/записи файла
public fileTransfering transferStatus; //статус передачи
private string serverIP; //IP сервера для подключения
//конструктор управляющего обьекта
public Controller (MainForm form, Client client);
//подключение к серверу, вызов метода Connect обьекта Client
public bool Connect (string ServerIP, string login, string pass);
//регистрация на сервере, вызов метода Register обьекта Client
public bool Register (string ServerIP, string login, string pass);
//выполнение необходимой команды
public void ExecuteCommand (string str);
//обработка полученной команды
private void Parse (string str);
//отмена передачи файла
public void CancelTransferRequest ();
//информирование пользователя о ходе передачи
private void ShowTransferProgress (int n, long totalSize);
//завершение передачи файла
private void FinishTransferFile (bool success);
//отмена передачи файла
public void AbortTransfer ();
//отослать сообщение в общую комнату
public void SendAll (string str);
//отослать сообщение в приватную комнату
public void SendPrivate (string target, string str);
//передача файла
public void SendFileRequest (string target);
//вернуть статус подключения
public bool ChatConnected ();
//отключиться от сервера
public void ChatDisconnect ();
//вернуть имя пользователя
public string GetNameClient ();
//вернуть IP сервера, к которому подключен клиент, необходимо //для информирования пользователя
public string GetServerIP ();
}
Класс «Controller» является главным в программе, он отслеживает состояние клиента, обмен клиентом данными с сервером и реализует взаимодействие с интерфейсом программы. Так же с помощью данного класса производится вывод информации в общую и приватные комнаты.
Класс «MainForm»
public partial class MainForm: Form
{
private Controller brain; //управляющий обьект
public List tabs; //коллекция приватных комнат
public FileTransferForm transferForm; //форма для //информирования пользователя о ходе передачи файла
private Icon icon1; //иконки трея
private Icon icon2;
public MainForm (); //конструктор главной формы
//подключение к серверу, создание обектов Controller и Client
private void подключениеToolStripMenuItem_Click (object sender, EventArgs e);
static string getMd5Hash (string input); //вычисление хеша пароля
//установить указатель на управляющийобьект
public void setController (Controller controller);
//вызов метода Connect обьекта Controller
public void Login (string serverIP, string login, string pass);
//вызов метода Register обьекта Controller
public void Register (string serverIP, string login, string pass);
//добавление сообщения в главную комнату
public void UpdateMainWindow (string str, bool alarm);
//обновление списка собеседников
public void UpdateUserlist (string userlist);
//обработка начжатия клавиши отправки сообщения
private void sendButton_Click (object sender, EventArgs e);
//обработка отключения от сервера
public void OnDisconnect (string reason);
//корректное завершение программы при закрытии гдавной //формы
private void MainForm_FormClosing (object sender, FormClosingEventArgs e);
//отключение от сервера
private void отключениеToolStripMenuItem_Click (object sender, EventArgs e);
//отправка сообщения по нажатию клавиши «Enter»
private void sendTextBox_KeyDown (object sender, KeyEventArgs e);
//выбор собеседника для создания приватной комнаты
private void listBox1_MouseDoubleClick (object sender, MouseEventArgs e);
//создание приватной комнаты и интерфейса общения в приватной комнате
public void CreateTab (string str);
//выход из приватной комнаты
private void CloseTab (string str);
//добавление сообщения в приватную комнату
public void UpdatePrivateRoom (string name, string sender, string param, bool backmessage);
//показать созданную приватную комнату
private void mainTabControl_SelectedIndexChanged (object sender, EventArgs e);
//доступность элементов управления взависимости от состояния //подключения
public void ChangeStateButton (bool b);
public void AbortTransfer (); //отмена передачи файла
public void SetOpportunitySending (bool opportunity);
//обработка свертывания в трей
private void MainForm_SizeChanged (object sender, EventArgs e);
//информирование пользователя о сообщении, когда главное //окно свернуто в трей
public void startAlarm ();
public void stopAlarm ();
//разворачивание из трея
private void notifyIcon1_MouseClick (object sender, MouseEventArgs e);
private void MainForm_Activated (object sender, EventArgs e);
//вызов О Программе
private void оПрограммеToolStripMenuItem_Click (object sender, EventArgs e);
//создание приватной комнаты
private void button1_Click (object sender, EventArgs e);
}
Класс «MainForm» реализует взаимодействие между пользователем и программой.
Когда пользователь подключается к серверу, если подключение прошло удачно, создается объект класса Controller, в котором создается объект класса Client. В данном объекте есть функция, которая слушает команды от сервера, которые передает на обработку объекту Controller. При запуске программы создается объект класса MainForm, который осуществляет взаимодействие между интерфейсом и управляющим объектом класса Controller/
Руководство пользователя. Требования к программному и аппаратному обеспечению
Рекомендуемые системные требования:
Операционная система Windows ME/2K/XP/Seven/Ubuntu
Видео SVGA (800×600, 65 536 цветов)
Процессор x86-совместимый 600 MHz
Оперативная память 128 MB
Место на жестком диске не менее 10 MB
Устройства ввода Клавиатура, Мышь
Внимание! Для корректной работы программы необходимо, чтобы в вашей системе были установлено средства .NET Framework 3.5 или более поздняя версия. Если данный компонент не установлен у Вас в системе, то его можно найти на официальном сайте Microsoft (http://www.microsoft.com/downloads/details.aspx?FamilyId=33 3325FD-AE52−4E35-B531−508D977D32A6&displaylang=en).
Если используется ОС Ubuntu, то необходимо, чтобы был установлен пакет Mono.(данный макет можно скачать с официального сайта http://www.go-mono.com/mono-downloads/download.html, либо установить через Центр Приложений)
Инструкция по использованию программного средства. Программа-сервер
Для корректной работы програамы-сервера необходимо, чтобы был установлен пакет MySQL 5.5.10 или более новая версия, найти данный пакет можно на официальном сайте продукта http://www.mysql.ru/download/
Во время установки данного программного средства, базы данных и все необходимые компоненты буду скопированы в установочный каталог.
После запуска сервера, появиться главное окно, изображенное на рисунке 5.1.
Рисунок 5.1 — Главное окно программы-сервера
Для того, чтобы клиенты могли подключиться к серверу, необходимо запустить его следующим образом, кликнуть на кнопку «Старт», сервер запустится. Чтобы отобразить лог файла необходимо кликнуть на кнопку «Лог», появиться окно с записями о работе сервера (Рисунок 5.2).
Рисунок 5.2 — Окно вывода лога работы сервера
Останов сервера производится кнопкой «Стоп».
Программа создана так, чтобы можно было запустить только один экземпляр программы-сервера. При попытке запустить второй экземпляр, будет выдано сообщение о невозможности данного действия (Рисунок 5.3).
Рисунок 5.3 — Ошибка при запуске второго экземпляра программы
Программа-клиент
После запуска программы появиться главное окно программы, изображенное на рисунке 5.4.
Рисунок 5.4 — Главное окно программы-клиента
После запуска программы необходимо подключиться к серверу, для этого выбираем меню Файл, далее подключение, либо сочетание клавиш Ctrl+Shift+C, появиться окно (Рисунок 5.5).
Рисунок 5.5 — Форма подключения к серверу
В данном окне необходимо корректно заполнить поля для подключения и нажать кнопку «Подключение». Далее программа подключится к серверу, если все данные верны, либо выдаст ошибку с указанием неверных действий.
Если у пользователя еще нет зарегистрированной учетной записи на сервере, то можно воспользоваться регистрацией, для этого в окне подключения нужно выбрать «Регистрация», появиться окно (Рисунок 5.6).
Рисунок 5.6 — Окно для регистрации на сервере
После заполнения всех полей, необходимо нажать «Регистрация», программа отправит запрос на сервер, и если все поля заполнены корректно, на сервере будет заведена учетная запись, и программа подключится к серверу.
Если у пользователя нет учетной записи и он не хочет ее заводить, возможно войти на сервер как гость, для этого необходимо в окне «Подключение», установить галочку «Я гость». Программа подключится к серверу с гостевым логином.
После успешного подключения к серверу можно увидеть окно (Рисунок 5.7).
Рисунок 5.7 — Окно программы после подключения к серверу
Теперь пользователь может начать общение в общей комнате.
У пользователя есть возможность общаться с другим собеседником напрямую, в приватной комнате, для этого необходимо выбрать собеседника в списке собеседников и нажать кнопку «Приватная комната», также это можно сделать двойным щелчком по имени собеседника, появится окно (Рисунок 5.8).
Рисунок 5.8 — Приватная комната
В приватной комнате общаются только два пользователя, никто не сможет увидеть их переписку, кроме них.
Также здесь можно отправлять друг другу файл и выходить из приватной комнату, для этого элементы управления расположены справа от окна переписки.
Во время передачи файла программа будет выводить информацию о ходе передачи (Рисунок 5.9).
Рисунок 5.9 — Процесс передачи файла
Для того чтобы отключиться от сервера необходимо нажать Файл и далее Отключение, либо Ctrl+Shift+D. При закрытии главного окна отключение происходит автоматически.
Пользователь имеет возможность ознакомиться со справкой по программе, для .того достаточно нажать Помощь, далее Справка, или просто F1. Окно справки изображено на рисунке 5.10.
Рисунок 5.10 — Справка.
Расчет экономических показателей программного продукта. Расчет себестоимости и цены программного продукта
В дипломном проекте реализована программа для обмена сообщениями между пользователями. Так как процесс разработки занимал определенное время, то целесообразно провести среднюю оценку затрат на реализацию программного продукта, а также провести расчеты себестоимости программного средства и его цены.
Под себестоимостью понимаются затраты, необходимые для производства продукта. Для её расчета необходимо оценить затраты времени на разработку программного продукта. Поскольку процесс написания программ является творческим, вести нормативы для оценки затрат очень сложно, то применяется метод экспертных оценок, суть которого состоит в оценке затрат несколькими экспертами. В данном случае в качестве экспертов выступают разработчик программного продукта и руководитель проекта.
Процесс разработки программного продукта состоит из нескольких этапов:
1. проектирование;
2. написание программы;
3. тестирование и отладка.
Первый этап включает в себя анализ требований, предъявляемых к программе, поиск необходимой информации в интернете и других источниках, составление алгоритма и др., то есть представляет собой интеллектуальный труд разработчика, который не может быть автоматизирован. Время, затрачиваемое на выполнение первого этапа, зависит от накопленных знаний и квалификации программиста.
Второй этап представляет собой реализацию разработанной программы на языке программирования.
Процесс отладки необходим для нахождения ошибок, не найденных на предыдущих этапах разработки, а процесс тестирования позволяет, с достаточной вероятностью, удостовериться в том, что программный продукт удовлетворяет требованиям, выработанным для него на этапе проектирования.
На основе экспертных оценок затрат времени определяется средняя величина для каждого из вышеуказанных этапов по формуле (6.1):
(6.1) | ||
где — средняя оценка;
— оценка руководителя проекта;
— оценка разработчика проекта.
Экспертные оценки времени рассчитываются по каждому этапу разработки программного продукта для трех ситуаций:
1. наименее возможная величина затрат ();
2. наиболее вероятная величина затрат ();
3. наиболее возможная величина затрат ().
Результаты расчета средней оценки времени на разработку программного продукта приведены в таблице 6.1.
Таблица 6.1 — Оценка затрат времени на разработку программного продукта
Этапы разработки программного продукта | Величина затрат | |||||||||
Наименее возможная, дни | Наиболее вероятная, дни | Наиболее возможная, дни | ||||||||
Проектирование | ||||||||||
Написание программы | ||||||||||
Тестирование и отладка | ||||||||||
Итого | ||||||||||
На основании таких оценок рассчитываются математическое ожидание и отклонение, по каждому этапу разработки комплекса программных продуктов.
Формула (6.2) для расчета математического ожидания:
(6.2) | ||
где — математическое ожидание для — го этапа;
, — средние значения затрат.
Стандартное отклонение для каждого этапа разработки программного продукта определяется по формуле (6.3):
(6.3) | ||
где — стандартное отклонение для — го этапа.
Общая оценка затрат на разработку программного продукта рассчитывается по формуле (6.4):
(6.4) | ||
где — общая оценка затрат;
— математическое ожидание затрат для — го этапа;
— количество этапов разработки программного продукта.
Стандартное отклонение в целом по программному продукту вычисляется по формуле (6.5):
(6.5) | ||
где — стандартное отклонение общей оценки затрат;
— стандартное отклонение оценки затрат для — го этапа.
На основе расчетов математического ожидания и стандартного отклонения вычисляется коэффициент вариации. Данный коэффициент показывает, насколько согласованы эксперты. Ниже приведены формулы (6.6) для расчета коэффициента вариации для — го этапа и формула (6.7) для вычисления общего коэффициента вариации:
(6.6) | ||
где — коэффициент вариации для — го этапа;
— стандартное отклонение оценки затрат — го этапа;
— математическое ожидание затрат для — го этапа.
(6.7) | ||
где — коэффициент вариации по всем этапам;
— стандартное отклонение оценки затрат по всем этапам;
— математическое ожидание затрат по всем этапам.
Результаты расчета, ,, а также, , приведены в таблице (6.2).
Таблица 6.2 — Затраты времени на разработку программного продукта, ,
Этапы разработки программного продукта | Средняя величина затрат времени по этапам | Математич. ожидание дни | Стандарт. отклонение дни | Коэфф. вариации дни | |||
Наименее возможная, дни | Наиболее вероятная, дни | Наиболее возможная, дни | |||||
Проектирование | 15,50 | 1,83 | 0,04 | ||||
Написание программы | 10,83 | 0,83 | 0,08 | ||||
Тестирование и отладка | 15,33 | 1,67 | 0,11 | ||||
Итого | 41,66 | 4,33 | 0,10 | ||||
Так как коэффициент вариации по программному продукту равен 0,10 и не превосходит 0,33, то мнения экспертов согласованы.
Расчет себестоимости программного продукта по формуле (6.8):
(6.8) | ||
где С — себестоимость комплекса программных продуктов;
— среднемесячная заработная плата программиста с учетом районного коэффициента;
— количество рабочих дней в месяце;
— трудозатраты на проектирование;
— трудозатраты на написание программы;
— трудозатраты на тестирование и отладку;
— коэффициент, учитывающий страховые взносы (согласно 24 главе НК РФ он составляет 34% от заработной платы);
— коэффициент, учитывающий накладные расходы;
— стоимость одного часа машинного времени;
— стоимость одного часа работы в интернете, согласно тарифному плану «Безлимитный — 512» компании «МТС»;
— количество дней работы на компьютере;
— количество дней работы в интернете.
Значения данных для подсчета себестоимости программного продукта представлены в таблице 6.3.
Таблица 6.3. Значения данных для подсчета себестоимости.
Показатель | Значение | |
руб | ||
дни | ||
дни | 15,50 | |
дни | 10,83 | |
дни | 15,33 | |
% | ||
% | ||
руб | 0,65 | |
дни | ||
дни | ||
Рассчитаем стоимость одного часа машинного времени. Для этого рассчитаем затраты на эксплуатацию персонального компьютера за год по формуле (6.9):
(6.9) | ||
где — себестоимость одного часа машинного времени;
— затраты на электроэнергию за год работы;
— затраты на амортизационные отчисления;
— затраты на комплектующие материалы;
— прочие затраты;
— общее время работы компьютера за год.
Приведем формулы для расчета вышеперечисленных видов затрат. Общее время работы компьютера за год примем 1987 часов. Затраты на комплектующие материалы за год примем 2500 рублей. Затраты на электроэнергию зависят от тарифа на электроэнергию и потребляемой мощности персонального компьютера, а также от времени работы персонального компьютера. Формула (6.10) для расчета затрат на электроэнергию:
(6.10) | ||
где — затраты на электроэнергию за год работы;
— общее время работы компьютера за год;
— тариф электроэнергии за 1кВт;
— потребляемая мощность ПК по паспортным данным.
Примем потребляемую мощность персонального компьютера и тариф электроэнергии соответственно:
= 0,065 кВт./час.
= 1,76 руб./кВт.
По формуле (1.10) находим затраты на электроэнергию в год:
руб.
Амортизационные отчисления в год рассчитываются по формуле (6.11):
(6.11) | ||
где — затраты на амортизационные отчисления;
— стоимость персонального компьютера (18 000 руб.);
— процент отчисления на амортизацию.
Процент отчисления на амортизацию рассчитываются согласно методике, отраженной в статье 259.1 НК РФ. Согласно постановлению правительства РФ от 01 января 2002 под № 1 «О классификации основных средств, включаемых в амортизационные группы», срок использования основных средств составляет от 2 до 3 лет. В рамках дипломного проекта установим срок полезного использования 2 года.
Определим процент отчисления на амортизацию:
Произведем расчет амортизационных средств по формуле (1.11):
руб./год.
Прочие расходы составляют 5% от суммы затрат. Они рассчитываются по формуле (1.12):
. | (6.12) | |
По формуле (6.12) находим:
руб./год.
Зная все данные, подсчитаем стоимость одного часа машинного времени по формуле (6.9):
руб.
Рассчитаем себестоимость программного обеспечения по формуле (6.8):
руб Цена программного продукта рассчитывается по формуле (6.13):
(6.13) | ||
где — цена программного продукта;
— себестоимость программного продукта;
— рентабельность программного продукта.
Рентабельность программного продукта примем:
=20% = 0,2
По формуле (1.13) находим:
руб.
Цена программного продукта с учетом НДС рассчитывается по формуле (6.14):
(6.14) | ||
где — цена программного продукта с НДС;
— цена программного продукта;
— составляет 18% от цены программного продукта согласно статье 164 из 21 главы НК РФ.
По формуле (1.14) вычисляется цена программного продукта с учетом НДС:
руб.
Итого, стоимость данного программного продукта на рынке будет составлять 80 803,5 руб.
Сравнение по экономическим показателям
В данный момент на рынке ПО очень большое количество программ для обмена сообщениями между пользователями, развитие которых не стоит на месте. Можно перечислить некоторые: ICQ, IRC, Skype, Jabber и др.
Если сравнивать продукт, который разработан в данном дипломном проекте (далее KAChat), то можно выявить, что он в чем-то уступает, а в чем-то превосходит гигантов рынка.
Например, ICQ и Skype требует активного подключения к интернету, для того чтобы пользователь мог авторизоваться, KAChat может работать в локальной сети без использования Интернета, но так же сервер может находиться на внешнем ресурсе, что позволит клиентам общаться из разных локальных сетей. При использовании ICQ клиенту не приходится задумываться о размещении серверной части, т.к. она находится на внешних ресурсах, это не всегда удобно, при сбое на данных ресурсах клиент остается без связи, у KAChat сервер может быть размещен где угодно, и клиент сам решает, как его обслуживать, что обеспечивает его связью.