Многопользовательский сетевой чат
Пользовательский интерфейс, функциональное, структурное, алгоритмическое и архитектурное обеспечение программы. Разработка руководства пользователя и методики интеграционных и модульных тестов. Анализ исходного кода приложения, его производительности.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 17.06.2013 |
Размер файла | 464,5 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru
Размещено на http://www.allbest.ru
СОДЕРЖАНИЕ
ВВЕДЕНИЕ
1. АНАЛИЗ ИСХОДНЫХ ДАННЫХ
1.1 Анализ предметной области
1.2 Специальное и общесистемное программное обеспечение
2. ПРОГРАММНОЕ ПРОЕКТИРОВАНИЕ
2.1 Пользовательский интерфейс
2.2 Функциональное обеспечение
2.3 Структурное обеспечение
2.4 Алгоритмическое обеспечение
2.5 Архитектурное обеспечение
2.6 Информационные структуры
3. ПРОГРАММНАЯ РЕАЛИЗАЦИЯ
3.1 Детальная реализация функциональных частей ПО
3.1.1 Реализация функциональной части
3.1.2 Разработка пользовательского интерфейса
3.2 Сопроводительная документация программного обеспечения
3.2.1 Разработка описания программы
3.2.2 Разработка руководства пользователя
3.2.3 Разработка методики интеграционных тестов
3.3 Анализ программного обеспечения
3.3.1 Анализ исходного кода приложения
3.3.2 Анализ производительности приложения
3.4 Тестирование программного обеспечения
3.4.1 Разработка модульных тестов
3.4.2 Результаты интегрированного тестирования
ЗАКЛЮЧЕНИЕ
СПИСОК ЛИТЕРАТУРЫ
ПРИЛОЖЕНИЕ А. Диаграмма вариантов использования
ПРИЛОЖЕНИЕ Б. Диаграмма классов
ПРИЛОЖЕНИЕ В. Диаграмма последовательности
ПРИЛОЖЕНИЕ Г. Диаграмма активности
ПРИЛОЖЕНИЕ Д. Диаграмма развёртывания
Введение
В данном курсовом проекте предполагается реализовать программное обеспечение c графическим интерфейсом для обмена сообщениями посредством локальной или беспроводной сети.
Основное предназначение реализуемого программного продукта - передача символьной информации, а так же файлов.
Язык, выбранный для реализации курсового проекта - QT - мощный язык программирования, подходящий для решения любых задач.
Данный программный продукт может использоваться пользователями в офисе, а так же дома.
На данный момент существует множество аналогов данного продукта.
Одним из них является программа FChat которая является настольным приложением и предлагает следующие функции:
Достоинства:
Отправка файлов.
Создание приватной комнаты..
Платный программный продукт.
Такие продукты, как FChat широко используются пользователями, и реализуют лишь часть желаемого функционала. Разрабатываемый программный продукт, в рамках курсовой работы, будет включать в себя функционал имеющийся в вышеописанном продукте, а именно:
работа по сети;
передача сообщений;
передача файлов.
Одной из задач является реализовать удобный интерфейс на клиентской стороне, для наилучшего взаимодействия продукта и пользователя.
1. АНАЛИЗ ИСХОДНЫХ ДАННЫХ
1.1 Анализ предметной области
Предметная область проекта - передача информации по сети.
Чат, позволяющий организовать общение между неограниченным количеством пользователей, а так же, позволяющий передавать файлы.
Требуется разработать приложение которое включает в себя разработку следующих функциональных частей:
Разработка серверного приложения. На его стороне должен работать в скрытом от пользователя режиме агент, который представляет возможность принимать информацию от одного клиента и рассылать ее остальным.
Разработка клиентского приложения. Клиент должен представлять собой приложение с GUI(Graphical user interface) и может подключаться к серверу.
1.2 Специальное и общесистемное программное обеспечение
При написании данного курсового проекта планируется использовать следующее стороннее программное обеспечение и инструментарий:
- QT Creator - среда разработки приложения , включающих интегрированную среду разработки программного обеспечения и ряд других инструментальных средств. Данные продукты позволяют разрабатывать приложения с графическим интерфейсом [1]
- Клиент планируется писать на QT.[2]
- Microsoft Office Word 2010 - написание пояснительной записки, описания программы, руководства пользователя.[3]
- ArgoUML проектирование и подготовка диаграмм.[4]
Разработка будет осуществляться в операционной системе Windows 7.. Серверное приложение будет реализовано с отсутствием интерфейса, так как будет работать в скрытом(невидимом для пользователя) режиме, что позволит сфокусироваться на его функциональности.[5]
2. ПРОГРАММНОЕ ПРОЕКТИРОВАНИЕ
2.1 Пользовательский интерфейс
При загрузке приложений, в первую очередь пользователь видит интерфейс продукта, поэтому особое внимание требуется уделить на разработку интерфейса. Основные критерии создания пользовательского интерфейса:
Программа должна содержать в себе следующие элементы: Строка ввода, поле отображения сообщений, кнопки управления. Таким образом программа становится простой даже для неопытного пользователя.
Основное пространство отображения информации на форме будет распределено следующим образом.
Снизу располагается строка ввода, она неактивна, пока не произойдет подключение к серверу. Сверху будет кнопка подключения к серверу. Справа находится список клиентов.
После составления вышеописанных требований был составлен прототип интерфейса главного окна (Рис.1.1).
Рисунок 1.1 - Прототип интерфейса главного окна
Серверное приложение работает в скрытом от пользователя режиме и не требует никаких действий. Поэтому пользовательский интерфейс у сервера отсутствует.
2.2 Функциональное обеспечение
Прежде, чем начинать разработку необходимо заранее определить требуемый функционал нашего программного обеспечения, чтобы это сделать было решено составить диаграмму вариантов использования (прецедентов).
В данном проекте в качестве актеров выступают пользователь, (клиентское приложение) и сервер.
Пользователь взаимодействует непосредственно с серверным приложением и должен иметь возможность выполнить следующие действия:
Присоединиться к серверу.
Отослать сообщение серверу.
Передать файл.
Принять файл.
На основании вышесказанного была построена диаграмма вариантов использования, представленная в Приложении А.
2.3 Структурное обеспечение
Клиент состоит из пяти классов:
CSmile Класс, для генерации смайлов
MainWindow Главная форма клиента
Options Класс опций
privateForm Форма с вкладками приватных чатов
TabForm Форма вкладки которая используется для виджета на форме приватных сообщений
Классы содержат следующие методы:
initSmile Функция создает список смайлов и помещает их в нужный виджет
postMessage Функция форматирует строку для чата
prepareSmiles Функция ковертирует коды смайлов в html сущность
prepareTime обработка времени
prepareNick обработка ника
sendMyMessage функция вставляет в чат сообщение клиента
removeUserFromList удаляет пользователя из списка находящихся на канале
send отправляет сообщение серверу
EventMenuInitPrivateTab вызывает форму с приватом
EventPublicMessage Отсылает публичное сообщение
EventPrivateMessage Отсылает приватное сообщение
EventMenuInitTransfer Инициализируется подготовка к отправке файла другому пользователю
EventConnected Событие вызывается при подключении к серверу
EventDisconnected Событие вызывается при отключении от сервера
EventReadyRead Событие вызывается, когда от сервера приходит информация
EventNewTransfer событие вызывается, когда к нашему файловому серверу кто-то подключается
EventTransferServerReadyRead начинается чтение данных их сокета, который создается при подключении к нашему файловому серверу
На основании вышесказанного была построена диаграмма классов, представленная в Приложении Б.
2.4 Алгоритмическое обеспечение
Алгоритм обработки команд сервера на клиенте.
Клиент может получать текстовую информацию, и файлы:
Как только клиент получает текстовое сообщение, оно отображается в поле вывода информации вместе с ником отправителя.
Если же клиент получает файл, то появляется диалоговое окно, предупреждающее о входящем файле и подающее запрос о его получении.
2.5 Архитектурное обеспечение
Для взаимодействия клиента с сервером используется протокол передачи данных TCP.
Необходимым условием корректной работы сервера является наличие на машине библиотеки QtNetwork4.
Необходимым условием для работы клиента является наличие на машине библиотек QtGui4 и QtCore4, а так же QtNetwork4.
На основании вышесказанного была построена диаграмма активности, представленная в Приложении Д.
2.6 Информационное обеспечение
Перед реализацией программы было решено обмениваться информацией по протоколу передачи данных: TCP.
TCP имеет важное преимущество: гарантирует целостность доставки пакета до адресата.
Сервер с клиентом обменивается двумя типами данных.
Если серверу пришло сообщение строкового типа, то сервер
Обрабатывает сообщение и рассылает их всем остальным клиентам, в том числе и отправителю.
Если же на сервер приходит сигнал об отправке файла, то начинает работу функция EventTransferConnected, которая пересылает файл между клиентами.
3. ПРОГРАММНАЯ РЕАЛИЗАЦИЯ
3.1 Детальная реализация функциональных частей ПО
3.1.1 Реализация функциональной части
Сервер.
Сервер содержит достаточное количество методов, вот некоторые из них:
NewClient-Добавляет в список нового клиента и заносит информацию о нём в лог-файл.
Листинг 1 - исходный код метода NewClient
void CServer::newClient() { addLog("New client incoming"); QTcpSocket *clientConnection = m_Server->nextPendingConnection(); int idusersocs = clientConnection->socketDescriptor(); CClient *cc = new CClient(this, clientConnection); connect(cc, SIGNAL(EventReceiveMessage(CClient*,QString)), this, SLOT(EventReceiveMessage(CClient*,QString))); connect(cc, SIGNAL(EventReceivePrivateMessage(CClient*,QString,QString)), this, SLOT(EventReceivePrivateMessage(CClient*,QString,QString))); connect(cc, SIGNAL(EventReceivePublicMessage(CClient*, QString, QString)), this, SLOT(EventReceivePublicMessage(CClient*,QString, QString))); connect(cc, SIGNAL(DeleteMe(int, QString)), this, SLOT(deleteClient(int, QString))); m_Clients->insert(idusersocs, cc); } |
AddPublicMessage - данный метод отправляет сообщение в основной канал
Листинг 2 - листинг метода AddPublicMessage
void CChannel::addPublicMessage(QString nMessage, QString nName, bool nSelf) { for (QMap <QString, CClient *>::const_iterator i = m_Clients->begin(); i != m_Clients->end(); i++) { if (nSelf) { (*i)->addChannelMessage(nName, m_Name, nMessage); } else { if (nName!=(*i)->getName()) { (*i)->addChannelMessage(nName, m_Name, nMessage); } } |
RemoveUserWithreason - данный метод вызывается, когда нужно отключить клиента по какой-либо причине
Листинг 3 - метод RemoveUserWithreason
void CChannel::removeUserWithReason(CClient *nClient, QString nReason) { if (m_Clients->contains(nClient->getName().toLower())) { m_Clients->remove(nClient->getName().toLower()); QString name = nClient->getName(); this->m_UserList.removeOne(name); for (QMap <QString, CClient *>::const_iterator i = m_Clients->begin(); i != m_Clients->end(); i++) { (*i)->addPartMessage(nClient->getFullName(), m_Name, nReason); } } } |
Клиент.
Клиентское приложение взаимодействует с пользователем и выполняет его команды:
Подключение к серверу
Передача файлов
Передача строковой информации
При выборе любого из этих действий выполняется соответствующий ему обработчик. Отправка команды клиентам происходит в методах, чье выполнение ожидается в данный момент. В листинге 4 приведён пример одного из методов. По нажатию на кнопку «отправить» вызывается метод sendMyMessage, который вставляет в чат сообщение клиента.
Листинг 4 - метод SendMyMessage
void MainWindow::sendMyMessage() { QString out = ui->textInput->text(); if (!out.isEmpty()) { QString formated; formated.append(prepareTime()); formated.append(prepareNick(m_Nick)); formated.append(prepareSmiles(out)); formated.append("<br>"); ui->chatWindow->insertHtml(formated); ui->textInput->clear(); EventPublicMessage(out); } } |
При активации кнопки «Отключиться», запускается метод закрытия клиентского сокета.
Листинг 5 - Обработка нажатия кнопки «Отключиться».
void MainWindow::on_disconnectButton_clicked() { if (m_Socket) { ui->statusBar->showMessage("Отключились от сервера"); m_Socket->disconnectFromHost(); } } |
3.1.2 Разработка пользовательского интерфейса
При разработке пользовательского интерфейса особое внимание уделялось простоте и удобству, для наилучшего взаимодействия программы с пользователем.
Клиент.
Графический интерфейс сервера разрабатывался с помощью GUI, и состоит из следующих элементов:
QPushButton
QTextEdit
QMainWndow
QListWidget
QComboBox
QStatusBar
QHBoxLayout
Рисунок 3.1 - графический интерфейс клиента.
Сервер.
Сервер работает в скрытом режиме, поэтому для него не нужен графический интерфейс.
3.2 Сопроводительная документация программного обеспечения
3.2.1 Разработка описания программы
Общее описание:
«Данный программный продукт предназначен для обмена информацией по локальной или беспроводной сети.
Приложение-сервер запускается на компьютере и работает в фоновом режиме. Клиентское приложение не требует от пользователя никаких настроек.
Приложение-клиент требует только ввода ника пользователя.
3.2.2 Разработка руководства пользователя
Подключите компьютер к сети.
Запустите Server и несколько Client на соответвующих сторонах.
Для запуска серверного и клиентского приложения необходимым и достаточным условием являются следующие требования:
Операционная система - Windows 7
Размер оперативной памяти - 2 гб. DDR2.
Свободное место на диске - 10 мб.
Наличие сетевой карты.
3.2.3 Разработка методики интеграционных тестов
Для проверки работоспособности приложения следует разработать интеграционные тесты описанные в таблице 3.1.
Таблица 3.2 - интеграционные тесты.
Описание теста |
Действия |
Результат |
|
1) Проверка отправки строковой информации |
Пересылка строки от клиента - серверу |
Убран мусор в сообщении, строка содержит только нужную информацию |
|
2) Проверка отправки изображений |
Передача файла, от одного клиента, другому |
Убрана проблема имени файла. Имя файла на приемнике полностью идентично имени на источнике. |
3.3 Анализ программного обеспечения
3.3.1 Анализ исходного кода приложения
Анализ исходного кода проводился с помощью встроенной утилиты в среду разработки QT Creator
Результат анализа исходного кода:
Предупреждения о переменных, содержащих излишнюю инициализацию - исправлено.
Предупреждение о неиспользуемых переменных - исправлено.
Критических ошибок в коде не обнаружено.
3.3.2 Анализ производительности системы
Анализ производительности демонстрационного приложения был проведен с помощью программы Performance Monitor Тесты показали, что приложения не дают значительной нагрузки, а значит на машинах сервер будет незаметен, а клиент не вызовет зависаний.
Рисунок 3.2 - результат анализа производительности.
3.4 Тестирование программного обеспечения
3.4.1 Разработка модульных тестов
В ходе тестирования программы было разработано два модульных теста, которые покрывают основную функциональную составляющую разработанного продукта.
Так как предметная область программного продукта обуславливает работу с файлами, первый модульный тест направлен на проверку целостности передачи файлов.
Суть второго модульного теста заключается в корректной передаче строковой информации .
Все тесты отработали правильно. Листинг функций модульного теста приведен ниже:
Листинг модульного теста №1
void MainWindow::EventMenuInitTransfer() { QString Nick; if (Nick.isEmpty()) { if (ui->userWindow->currentItem()) Nick = ui->userWindow->currentItem()->text(); QString fileName = QFileDialog::getOpenFileName(this, tr("Выберите файл для передачи"), "", tr("Files (*.*)")); m_UFile = new QFile(fileName); m_UFileSize = m_UFile->size(); QFileInfo info(m_UFile->fileName()); this->send("file request "+Nick+" " + QString::number(m_UFileSize) + " " + info.fileName()); ui->statusBar->showMessage("Запрашиваем разрешение на отправку файла..."); } void MainWindow::EventTransferConnected() { ui->statusBar->showMessage("Подключились к серверу передачи файлов"); if (m_UOperation && m_UFile) { ui->statusBar->showMessage("Отправляем файл " + m_UFile->fileName()); this->uploadFile(m_UFile); ui->statusBar->showMessage("Файл " + m_UFile->fileName() + " закачен"); } } void MainWindow::EventTransferDisconnected() { m_UOperation = false; if (m_UFile) { m_UFile->close(); delete m_UFile; m_UFile = NULL; } } void MainWindow::EventTransferError(QAbstractSocket::SocketError e) { m_UOperation = false; if (m_UFile) { m_UFile->close(); delete m_UFile; m_UFile = NULL; } } void MainWindow::EventNewTransfer() { m_TransferServerSocket = m_TransferServer->nextPendingConnection(); connect(m_TransferServerSocket, SIGNAL(disconnected()), this, SLOT(EventTransferServerDisconnected())); connect(m_TransferServerSocket, SIGNAL(readyRead()), this, SLOT(EventTransferServerReadyRead())); } void MainWindow::EventTransferServerDisconnected() { delete m_TransferServerSocket; m_TransferServerSocket = NULL; m_DOperation = false; if (m_DFile) { m_DFile->close(); this->ui->statusBar->showMessage("Скачивание файла " + m_DFile->fileName() + " завершилось"); delete m_DFile; m_DFile = NULL; } } void MainWindow::EventTransferServerReadyRead() { if (m_DOperation && m_DFile) { if (!m_DFile->isOpen()) m_DFile->open(QFile::WriteOnly); QDataStream write(m_DFile); long int lBytesDone = 0; //Пока ничего не приняли long int lSize = m_DFileSize; long int lBytes; while (lBytesDone < lSize){ //Пока приняли меньше, чем указано //Ожидаем данные lBytes = 0; while (lBytes == 0) lBytes = m_TransferServerSocket->waitForReadyRead(-1); if (-1 == lBytes){ m_TransferServerSocket->close(); } this->ui->statusBar->showMessage("Скачиваем " + m_DFile->fileName() + " ("+ QString::number(m_DFileSize) + " байт)"); QByteArray tmp = m_TransferServerSocket->readAll(); lBytes += write.writeRawData(tmp.data(), tmp.size()); lBytesDone += tmp.size(); } //m_TransferServerSocket->close(); this->ui->statusBar->showMessage("Скачивание файла " + m_DFile->fileName() + " завершилось"); m_DFile->close(); } } // функция начиеает передачу файла частями void MainWindow::uploadFile(QFile *f) { ui->statusBar->showMessage("Отправляем файл " + f->fileName()); if (!f->isOpen()) if (!f->open(QFile::ReadOnly)) qWarning() << "could not open file!"; QDataStream read(f); read.setVersion(QDataStream::Qt_4_8); int lBytes = 0; char *ch; ch = (char*)malloc(sizeof(char) * 1024); ch[1023] = '\0'; while(!read.atEnd()){ int l = read.readRawData(ch, sizeof(char)*1023); QByteArray ba(ch, sizeof(char)*l); lBytes += m_TransferSocket->write(ba, sizeof(char)*l); m_TransferSocket->flush(); if (-1 == lBytes){ qWarning() << "Error"; m_TransferSocket->close(); } } f->close(); m_UOperation = false; } |
Листинг модульного теста №2
void MainWindow::postMessage(QString user, QString message) { QString out = message; if (!out.isEmpty()) { QString formated; formated.append(prepareTime()); formated.append(prepareNick(user)); formated.append(prepareSmiles(out)); formated.append("<br>"); ui->chatWindow->insertHtml(formated); } } void MainWindow::sendMyMessage() { QString out = ui->textInput->text(); if (!out.isEmpty()) { QString formated; formated.append(prepareTime()); formated.append(prepareNick(m_Nick)); formated.append(prepareSmiles(out)); formated.append("<br>"); ui->chatWindow->insertHtml(formated); ui->textInput->clear(); EventPublicMessage(out); } } void MainWindow::send(QString cmd) { if (m_Socket) { m_Socket->write((cmd+"\r\n").toUtf8()); } } void MainWindow::EventPublicMessage(QString message) { send("PRIVMSG #main :" + message); } // Отсылает приватное сообщение void MainWindow::EventPrivateMessage(QString user, QString message) { send("PRIVMSG "+user+" :" + message); } |
3.4.2 Результаты интегрированного тестирования
Результат выполнения модульных тестов приведён в таблице 3.6.
№ теста |
Результат |
|
Проверка записи информации в файл |
Пройден. |
|
Проверка отправки строковой информации |
Пройден. |
Таблица 3.6 - Результат выполнения модульных тестов.
ЗАКЛЮЧЕНИЕ
В результате выполнения курсового проекта были разработаны следующие приложения: сервер и клиент. Данное приложение позволяет удалённо обмениваться информацией по локальной или беспроводной сети.
Были получены навыки и умения в следующих сферах:
Программирование на языке QT.
Получены навыки работы с сокетами.
В заключении хотелось бы отметить, что интерфейс на клиенте выполнен в наиболее удобном и простом варианте, что позволяет пользователю комфортно работать с приложениями.
ЛИТЕРАТУРА
Программа QT Creator [электронный ресурс]: http://rutracker.org/forum/viewtopic.php?t=4038622
Саммерфилд "Qt 4: программирование GUI
Программа Microsoft Office 2010 [электронный ресурс]: http://office.microsoft.com/ru-ru/
Материалы сайта CyberForum [электронный ресурс]: http://cyberforum.ru/
Программа ArgoUML [электронный ресурс]: http://www.argoUML.com
Приложение А
Приложение Б
Приложение В
Приложение Г
Приложение Д
интерфейс код тест приложение
Размещено на allbest.ru
Подобные документы
Разработка консольного приложения: описание и сценарий использования программы, интерфейс пользователя. Поэтапное описание создание кода компьютерной игры "Крестики нолики". Функциональные и нефункциональные требования, описание исключительных ситуаций.
методичка [819,6 K], добавлен 12.05.2013Понятие, законодательное регулирование и виды электронных подписей. Разработка структурной схемы приложения и базы данных. Создание диаграммы прецедентов и классов. Проектирование интерфейса программы. Анализ руководства пользователя web-приложения.
дипломная работа [869,8 K], добавлен 12.08.2017Пользовательский интерфейс - "лицо" системы, от продуманности которого зависит эффективность работы пользователя с системой. Функциональное тестирование пользовательских интерфейсов. Проверка требований, тестопригодность. Методы проведения тестирования.
реферат [28,7 K], добавлен 21.01.2010Функциональное назначение и область применения программы "Локальный сетевой чат"; логическая структура, технические и программные средства. Требования к программе; характеристика, вызов и загрузка, входные и выходные данные, настройка, интерфейс.
дипломная работа [1,3 M], добавлен 18.10.2013Разработка программного кода и алгоритма действий приложения "калькулятор". Использование функций в программе Matlab. Разработка кнопок, опций, интерфейса, оформление. Части кода Matlab и тестовый набор. Инструкция пользователя по работе программы.
курсовая работа [527,1 K], добавлен 27.09.2014Разработка программы для выполнения арифметических операций с комплексными числами. Разработка эскизного проекта. Диаграмма последовательностей и классов. Разработка и описание программы. Разработка программного кода и руководства пользователя.
курсовая работа [1,2 M], добавлен 25.11.2011Специальное и общесистемное программное обеспечение. Разработка диаграммы прецедентов, классов, деятельности, состояний. Детальная реализация функциональных частей программного обеспечения. Разработка пользовательского интерфейса, методика испытаний.
курсовая работа [3,3 M], добавлен 26.01.2013Анализ предметной области создания программы организации, предоставляющей услуги проката DVD и CD дисков. Описание информационных процессов, обоснование необходимости автоматизации. Разработка приложения, среда реализации и пользовательский интерфейс.
курсовая работа [43,6 K], добавлен 23.03.2010Описания программного приложения для интерпретации и моделирования пласта. Технологическая цепочка в Petrel. Интерфейс программы. Проведение сейсмической объемной визуализации. Создание корреляции скважин на экране. Структурное моделирование разломов.
доклад [2,3 M], добавлен 15.05.2016Знакомство с интерфейсом пользователя и сценарием использования программы игры в крестики и нолики. Функциональные и нефункциональные требования для персонального компьютера. Исключительные ситуации и реакция программы. Пример кода игры и комментарии.
курсовая работа [236,5 K], добавлен 27.01.2014