Многопользовательский сетевой чат

 

СОДЕРЖАНИЕ


ВВЕДЕНИЕ

. АНАЛИЗ ИСХОДНЫХ ДАННЫХ

.1 Анализ предметной области

.2 Специальное и общесистемное программное обеспечение

. ПРОГРАММНОЕ ПРОЕКТИРОВАНИЕ

.1 Пользовательский интерфейс

.2 Функциональное обеспечение

.3 Структурное обеспечение

.4 Алгоритмическое обеспечение

.5 Архитектурное обеспечение

.6 Информационные структуры

. ПРОГРАММНАЯ РЕАЛИЗАЦИЯ

.1 Детальная реализация функциональных частей ПО

.1.1 Реализация функциональной части

.1.2 Разработка пользовательского интерфейса

.2 Сопроводительная документация программного обеспечения

.2.1 Разработка описания программы

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

.2.3 Разработка методики интеграционных тестов

.3 Анализ программного обеспечения

.3.1 Анализ исходного кода приложения

.3.2 Анализ производительности приложения

.4 Тестирование программного обеспечения

.4.1 Разработка модульных тестов

.4.2 Результаты интегрированного тестирования

ЗАКЛЮЧЕНИЕ

СПИСОК ЛИТЕРАТУРЫ

ПРИЛОЖЕНИЕ А. Диаграмма вариантов использования

ПРИЛОЖЕНИЕ Б. Диаграмма классов

ПРИЛОЖЕНИЕ В. Диаграмма последовательности

ПРИЛОЖЕНИЕ Г. Диаграмма активности

ПРИЛОЖЕНИЕ Д. Диаграмма развёртывания



Введение


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

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

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

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

На данный момент существует множество аналогов данного продукта.

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

Достоинства:

Отправка файлов.

Создание приватной комнаты..

Платный программный продукт.

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

работа по сети;

передача сообщений;

передача файлов.

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



1. АНАЛИЗ ИСХОДНЫХ ДАННЫХ


.1 Анализ предметной области


Предметная область проекта - передача информации по сети.

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

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

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

Разработка клиентского приложения. Клиент должен представлять собой приложение с GUI(Graphical user interface) и может подключаться к серверу.


1.2 Специальное и общесистемное программное обеспечение


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

QT Creator - среда разработки приложения , включающих интегрированную среду разработки программного обеспечения и ряд других инструментальных средств. Данные продукты позволяют разрабатывать приложения с графическим интерфейсом [1]

Клиент планируется писать на QT.[2]

Microsoft Office Word 2010 - написание пояснительной записки, описания программы, руководства пользователя.[3]

ArgoUML проектирование и подготовка диаграмм.[4]

Разработка будет осуществляться в операционной системе Windows 7.. Серверное приложение будет реализовано с отсутствием интерфейса, так как будет работать в скрытом(невидимом для пользователя) режиме, что позволит сфокусироваться на его функциональности.[5]



2. ПРОГРАММНОЕ ПРОЕКТИРОВАНИЕ


.1 Пользовательский интерфейс


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

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

Основное пространство отображения информации на форме будет распределено следующим образом.

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

После составления вышеописанных требований был составлен прототип интерфейса главного окна (Рис.1.1).


Рисунок 1.1 - Прототип интерфейса главного окна

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


.2 Функциональное обеспечение


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

В данном проекте в качестве актеров выступают пользователь, (клиентское приложение) и сервер.

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

Присоединиться к серверу.

Отослать сообщение серверу.

Передать файл.

Принять файл.

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


2.3 Структурное обеспечение


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

Классы содержат следующие методы:Функция создает список смайлов и помещает их в нужный виджет

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.

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


.6 Информационное обеспечение


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

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

Если серверу пришло сообщение строкового типа, то сервер

Обрабатывает сообщение и рассылает их всем остальным клиентам, в том числе и отправителю.

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

. ПРОГРАММНАЯ РЕАЛИЗАЦИЯ


.1 Детальная реализация функциональных частей ПО


.1.1 Реализация функциональной части

Сервер.

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

Листинг 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); } - данный метод отправляет сообщение в основной канал


Листинг 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, и состоит из следующих элементов:

Рисунок 3.1 - графический интерфейс клиента.


Сервер.

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


3.2 Сопроводительная документация программного обеспечения


.2.1Разработка описания программы

Общее описание:

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

Приложение-сервер запускается на компьютере и работает в фоновом режиме. Клиентское приложение не требует от пользователя никаких настроек.

Приложение-клиент требует только ввода ника пользователя.




3.2.2 Разработка руководства пользователя

Подключите компьютер к сети.

Запустите Server и несколько Client на соответвующих сторонах.

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

Операционная система - Windows 7

Размер оперативной памяти - 2 гб. DDR2.

Свободное место на диске - 10 мб.

Наличие сетевой карты.


3.2.3 Разработка методики интеграционных тестов

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


Таблица 3.2 - интеграционные тесты.

Описание тестаДействияРезультат 1) Проверка отправки строковой информацииПересылка строки от клиента - серверуУбран мусор в сообщении, строка содержит только нужную информацию2) Проверка отправки изображенийПередача файла, от одного клиента, другомуУбрана проблема имени файла. Имя файла на приемнике полностью идентично имени на источнике.

3.3 Анализ программного обеспечения


.3.1 Анализ исходного кода приложения

Анализ исходного кода проводился с помощью встроенной утилиты в среду разработки QT Creator

Результат анализа исходного кода:

Предупреждения о переменных, содержащих излишнюю инициализацию - исправлено.

Предупреждение о неиспользуемых переменных - исправлено.

Критических ошибок в коде не обнаружено.


3.3.2 Анализ производительности системы

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


Рисунок 3.2 - результат анализа производительности.


.4 Тестирование программного обеспечения


.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 [электронный ресурс]: <#"justify">Приложение А





Приложение Б






Приложение В





Приложение Г






Приложение Д

интерфейс код тест приложение


СОДЕРЖАНИЕ ВВЕДЕНИЕ . АНАЛИЗ ИСХОДНЫХ ДАННЫХ .1 Анализ предметной области .2 Специальное и общесистемное программное обеспечение . ПРОГРАММНО

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ