Разработка аналога системы p2p
Министерство
образования и науки Российской Федерации
Муромский институт (филиал)
Государственного
образовательного учреждения высшего
профессионального образования
«Владимирский государственный университет
имени Александра Григорьевича и Николая
Григорьевича Столетовых»
(МИ (филиал) ВлГУ)
Факульт
Кафедра
Информационных
систем
КУРСОВОЙ
ПРОЕКТ
по ИСРОД .
(наименование дисциплины)
Тема: Разработка аналога системы p2p
Руководитель
(оценка) (фамилия, инициалы)
(подпись) (дата)
Члены комиссии Студент ПИ-107
(подпись) (Ф.И.О.) (фамилия, инициалы)
(подпись)
Муром 2011
В
данном курсовом проекте разработана
программа-аналог системы p2p. Данная программа
создана в среде Delphi версии 7.0. Программа
представляет собой комплекс средств
для обмена файлами между пользователями
в сети, включающий в себя хаб, клиентское
приложение, поиск нужных файлов, предоставление
доступа к информации, чат между пользователями.
Наряду с этим, в программе реализованы
права доступа на действия с файлами пользователей.
Содержание
Введение 5
1. Анализ технического задания 7
2. Реализация 13
3. Тестирование 13
Заключение 18
Список
литературы 19
Приложение
А Листинг программы. 20
Введение
Сегодня уже невозможно себе представить персональный компьютер не имеющий выхода в сеть. Обмен информацией по сети стал настолько незаменимым средством коммуникации, что мы просто не представляем как ранее могли обходиться без него. У обмена информацией по сети множество преимуществ, таких как простота реализации, легкая доступность, а также при наличии высокой скорости в сети - быстрая передача файлов между пользователями.
Дальнейшее
развитие этих технологий привело к созданию
одноранговых,
Одна из главных областей применения технологии одноранговых сетей — это обмен файлами. Пользователи файлообменной сети выкладывают какие-либо файлы в так называемую «расшаренную» (англ. share — делиться) директорию, содержимое которой доступно для скачивания другим пользователям. Какой-нибудь другой пользователь сети посылает запрос на поиск какого-либо файла. Программа ищет у клиентов сети файлы, соответствующие запросу, и показывает результат. После этого пользователь может скачать файлы у найденных источников. В современных файлообменных сетях информация загружается сразу с нескольких источников. Ее целостность проверяется по контрольным суммам[2].
В
данном курсовом проекте будет осуществлена
реализация аналога системы p2p. Программа
будет состоять из хаба и клиента. Клиентское
приложение будет осуществлять поиск
и скачивание требуемых файлов. Кроме
того, в программе будет возможность обмена
сообщениями между пользователями посредством
чата, а также пользователи смогут предоставлять
доступ к своим файлам. Хаб-приложение
будет средством администрирования между
пользователями. Также в нем будет возможно
регистрировать новых пользователей.
1. Анализ технического задания
Тему курсового проекта – разработка аналога системы p2p. Исходя из задания, необходимо разработать программу, которая будет осуществлять поиск и обмен файлами между пользователями программы, иметь средства коммуникации между клиентами, а также иметь средства администрирования работы. Задачу, поставленную в данной работе можно разделить на две основные подзадачи, каждая из которых требует собственно алгоритма реализации:
- Хаб сети. Хаб будет своего рода комнатой для пользователей. Хаб имеет собственный ip-адрес и порт. Также хаб будет включать широкие опции администрирования. Возможна регистрация новых пользователей и выдача им паролей, а также удаление пользователей программы из сети.
- Клиент-приложение. Клиентское приложение будет осуществлять доступ по ip адресу на запущенный в сети хаб. Для доступа на хаб нужно лишь знать адрес хаба, а также логин и пароль для зарегистрированных пользователей. Другие пользователи, вошедшие без регистрации могут иметь меньше прав по сравнению с зарегистрированными. В клиентском приложении пользователи могут с помощью кнопки поиска найти требуемый им файл, а затем и скачать его. Для общения между пользователями будет реализован чат. Вошедший на хаб должен расшарить каталог с файлами, то есть открыть доступ к части своих файлов другим пользователям, чтобы они также могли скачать требуемую им информацию. Также пользователи могут определять каким пользователям они разрешают скачивать у себя файлы, а каким запрещают доступ к своим файлам. Для этого требуется реализовать механизм ограничения прав доступа на файлы определенным лицам.
Разрабатываемое
приложение должно быть как можно
проще в работе, иметь доступный
и легкий интерфейс, чтобы у пользователя
не возникало проблем с работой в программе.
Также оно должно удовлетворять требованиям
к системе пользователя.
Работа приложения начинается с запуска администратором хаба. Без его запуска пользователи сети не смогут увидеть друг друга. Администратор настраивает хаб – выбирает порт для него и узнает ip адрес компьютера на котором запущен хаб. Также администратор может регистрировать новых пользователей хаба, создавая им учетные записи с логинами и паролями зарегистрированных пользователей. Для запуска или отключения хаба администратором необходимо нажать соответствующие кнопки в интерфейсе программы.
После запуска администратором хаба, пользователи смогут войти на него через клиентское приложение. Запустив его пользователь должен наддать на кнопку соединения с хабом и ввести ip адрес и порт хаба. Если пользователь не зарегистрирован на хабе и не ввел свой пароль и логин при входе на хаб, то он считается гостем на хабе. Чтобы войти как зарегистрированный пользователь необходимо ввести при входе свои учетные данные, а именно пароль и логин выданные администратором хаба для зарегистрированных лиц. Войдя на хаб пользователь программы может сразу же начать поиск требуемого ему файла нажав на соответствующую кнопку поиска в приложении. На основе сделанного запроса пользователя будет осуществлен поиск по расшаренным файлам других пользователей, находящихся в данный момент также на этом хабе. Если файл будет найден, то результат запроса отобразится в окне поиска. Для скачивания файла необходимо лишь выбрать сам требуемый файл и нажать кнопку “Скачать файл”. В опциях программы пользователь может настроить каталог для скачивания новых файлов, а также указать собственные расшаренные файлы, то есть файлы открытые для доступа другим клиентам программы. Также сам пользователь может ограничить доступ к своим собственным файлам и действиям с ними определенным клиентам. При скачивании файла с другого компьютера возможно упаковать или распаковать скачиваемые файлы, например для уменьшения размера скачиваемых файлов, а следовательно и для уменьшения времени скачивания файла. Для обмена сообщениями между пользователями в программе требуется реализовать чат между клиентами.
Кроме того, в программе должна подробна и наглядно отражаться информация о скачивании или отдаче файлов пользователя. На основе последующего тестирования будет выявлена работоспособность программы, а также всех ее составных элементов.
В результате, по итогам проведенного анализа можно выявить основные этапы разработки данной программы:
1. Создание хаб-приложения;
- добавление зарегистрированных пользователей;
- запуск и остановка хаба;
- удаление пользователей с хаба.
2. Создание клиентского приложения:
- подключение к хабу;
- скачивание новых файлов;
- поиск требуемых файлов в сети;
- упаковка и распаковка информации;
- ограничение прав доступа к своим файлам;
- просмотр информации о файле и о процессе скачки;
- общение по чату.
Средой разработки требуемых алгоритмов является Delphi 7.0.
Список разрабатываемых классов программы и процедур, а также краткая информация по ним описана в таблице 1.
Таблица 1 – Классы и процедуры программы
| Программа | Класс | процедура | Описание |
| Хаб-приложение | Info | TfInfo.ShowInfo | Вызов информационного окна |
| Main | FormCreate | Создание формы | |
| FormDestroy | Удаление формы | ||
| btnExitClick | Выход из программы | ||
| 1 | 2 | 3 | 4 |
| 4 | |||
| btnMyIPClick | Определение ip-адреса | ||
| lvPeersChange | Изменение пользователей на хабе | ||
| FormShow | Отображение формы | ||
| btnRemoveClick | Процедура удаления | ||
| btnSettingsClick | Процедура опций хаба | ||
| btnUsersClick | Процедура регистрации пользователей | ||
| btnStartClick | Запуск хаба | ||
| btnStopClick | Остановка хаба | ||
| Settings | FormCreate | Создание формы | |
| FormShow | Отображение формы | ||
| SaveData | Сохранение изменений | ||
| Users | FormCreate | Создание формы | |
| FormDestroy | Удаление формы | ||
| btnEditClick | Редактирование пользователей | ||
| btnAddClick | Добавление пользователей | ||
| btnRemoveClick | Удаление пользователей | ||
| Клиент-приложение | Chat | LoadForm | Загрузка формы |
| SaveForm | Сохранение формы | ||
| btnChatClick | Отправка сообщения в чате | ||
| FormCreate | Создание формы | ||
| FormDestroy | Удаление формы | ||
| Connect | btnOkClick | Соединение с хабом | |
| Files | FormCreate | Создание формы | |
| FormDestroy | Удаление формы | ||
| btnInClick | Переход в каталог в шаре | ||
| 1 | 2 | 3 | 4 |
| 1 | 2 | 3 | 4 |
| btnUpClick | На каталог вверх в шаре | ||
| btnListClick | Список файлов пользователя | ||
| btnUnzipClick | Распаковка файлов | ||
| btnZipClick | Архивация файлов | ||
| btnUploadClick | Отдача файлов | ||
| btnDownloadClick | Скачивание файлов | ||
| btnRenameClick | Переименование файлов | ||
| btnDeleteClick | Удаление файлов | ||
| btnNewClick | Расшаривание файлов | ||
| btnAbortUploadClick | Прерывание отдачи | ||
| btnAbortDownloadClick | Прерывание закачки | ||
| Info | TfInfo.ShowInfo | Вызов информационного окна | |
| Main | FormCreate | Создание формы | |
| FormDestroy | Удаление формы | ||
| btnExitClick | Выход из программы | ||
| btnConnectClick | Соединение с хабом | ||
| btnCancelClick | Закрытие хаб | ||
| btnClearLogClick | Очистка чата | ||
| btnUsersClick | Переход к шаре пользователя | ||
| btnChatClick | Чат пользователей | ||
| btnFilesClick | Шара пользователя | ||
| btnSearchClick | Поиск файла | ||
| btnSettingsClick | Настройки программы | ||
| btnRemoveClick | Удаление файлов | ||
| User | Assign | Добавление пользователя | |
| 1 | 2 | 3 | 4 |
| 1 | 2 | 3 | 4 |
| Search | btnStartClick | Начало поиска | |
| btnStopClick | Остановка поиска | ||
| FormClose | Закрытие формы | ||
| Settings | FormCreate | Создание формы | |
| FormShow | Отображение формы | ||
| SaveData | Сохранение изменений |
2. Реализация
3. Тестирование
В качестве среды программирования разработанного аналога системы p2p была выбрана среда Dlphi 7.7. Конфигурация созданной программы представлена в таблице 1.
Запустим хаб:
Рисунок 1 – Запуск хаба
Для
подключения пользователей
Рисунок 2 – Получение ip-адресов хаба
После этого запустим два клиентских приложения и зайдем по данным ip-адресам на хаб:
Рисунок 3 – Вход нового пользователя на хаб
После входа двух пользователей информация о них отобразится на хабе:
Рисунок 4 – Изменения на хаба после входа пользователей
Скачаем файл у пользователя:
Рисунок 5 – скачивание и отдача файлов
Найдем файл:
Рисунок 6 – Поиск файла
Рисунок 7 – Чат между пользователями
Рисунок
8 – Добавление прав для пользователя
Рисунок 9 – Выход с хаба
Рисунок 10 – отключение хаба
Заключение
При выполнении данного курсового проекта мною был разработана программа-аналог системы p2p. В курсовом проекте были разработаны два приложения: хаб - для работы со множеством пользователей, и клиентское приложение – для взаимодейсвия самих пользователей между собой. Приложение разработано в среде программирования Delphi 7.0. В разработанной программе реализован обмен информацией между пользователями, поиск информации, общение клиентов программы между собой, настройка хаба и клиентов, возможность предоставлять доступ к файлам, регистрация пользователей на хабе, а также средства администрирования на хабе. Также в приложении отображаются различные характеристики файлов и процессов, процесс скачивания и отдачи файлов другим пользователям.
Разработанная программа была протестирована на работоспособность и эффективность. По результатам экспериментов было выявлено, что все базовые алгоритмы работают корректно и эффективно. Выполнены все исходные требования к проекту.
Цели
и задачи, поставленные на начальном
этапе проектирования, были успешно реализованы
в ходе выполнения данного курсового проекта.
Список литературы
1. Э. Таненбаум, М. ван Стеен Распределенные системы. – СПб.: Питер. 2003
2. Анатолий Хомоненко, Владимир Гофман, Евгений Мещеряков Delphi 7. – СПб.: БХВ-Петербург, 2010
3. А. Я. Архангельский Программирование в Delphi. – М.: Бином-Пресс, 2008
4. А.И.
Миков, Е.Б. Замятина Распределенные системы
и алгоритмы. –СПб. Питер,2007
ПРИЛОЖЕНИЕ А
Листинг программы
Клиентское приложение:
unit uMain;
interface
uses
ActiveX, Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ShlObj, StdCtrls, ComCtrls, ToolWin, Menus, ActnList, ImgList, StrUtils, Contnrs,
ExtCtrls, Registry, Variants, ShellAPI, Buttons, IniFiles,
bsP2PAgentSDK_TLB, ErrMsg, uAlert, uChat, uFiles, uSearch, Globals,
uSettings;
const
SESSION_STATUS_CONNECTING = 1;
SESSION_STATUS_CONNECTED = 2;
AUTO_OPEN_TIME = 5000;
AUTO_CLOSE_TIME = 2000;
type
TfMain = class(TForm)
StatusBar: TStatusBar;
Timer: TTimer;
GroupBox3: TGroupBox;
btnConnect: TButton;
btnDisconnect: TButton;
btnCancel: TButton;
btnExit: TButton;
GroupBox1: TGroupBox;
lvPeers: TListView;
btnFiles: TButton;
btnChat: TButton;
btnSearch: TButton;
GroupBox2: TGroupBox;
mmLog: TMemo;
btnUsers: TButton;
btnAlert: TButton;
btnSettings: TButton;
btnRemove: TButton;
btnBytes: TButton;
btnAutoTest: TSpeedButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure btnExitClick(Sender: TObject);
procedure btnConnectClick(Sender: TObject);
procedure btnCancelClick(Sender: TObject);
procedure btnDisconnectClick(Sender: TObject);
procedure btnClearLogClick(Sender: TObject);
procedure btnUsersClick(Sender: TObject);
procedure lvPeersChange(Sender: TObject; Item: TListItem; Change: TItemChange);
procedure btnChatClick(Sender: TObject);
procedure btnAlertClick(Sender: TObject);
procedure btnFilesClick(Sender: TObject);
procedure btnSearchClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure btnSettingsClick(Sender: TObject);
procedure btnBytesClick(Sender: TObject);
procedure btnRemoveClick(Sender: TObject);
procedure TimerTimer(Sender: TObject);
private
{ Private declarations }
StateTick: Longword;
procedure LogMsg(aText: String);
procedure AutoTest;
function SelectPeer(aHandle: Integer): Boolean;
procedure LoadForm;
procedure SaveForm;
procedure SetSettings;
procedure UpdateStatus;
procedure UpdateButtons;
procedure DeletePeer(aPeer: TPeer);
procedure GoSessionOpen(Sender: TObject);
procedure GoSessionClosed(Sender: TObject);
procedure GoSessionRejected(Sender: TObject; aCode: Integer);
procedure GoPeerConnected(Sender: TObject; aHandle: Integer);
procedure GoPeerDisconnected(Sender: TObject; aHandle: Integer);
procedure GoAlertMessage(Sender: TObject; aHandle: Integer; const aMessage: WideString);
procedure GoChatMessage(Sender: TObject; aHandle: Integer; const aMessage: WideString);
procedure GoBinaryMessage(Sender: TObject; aHandle: Integer; var aValue: OleVariant);
procedure GoNeedFileList(Sender: TObject; aHandle: Integer; const aPath: WideString; var aOkay: WordBool; var aRoot: WideString);
procedure GoHaveListItem(Sender: TObject; aHandle: Integer; const aName: WideString; aFolder: WordBool; aSizeLo, aSizeHi, aTimeLo, aTimeHi: Integer);
procedure GoListDone(Sender: TObject; aHandle: Integer; aCode: Integer);
procedure GoNeedCreateFolder(Sender: TObject; aHandle: Integer; const aPath: WideString; var aOkay: WordBool; var aRoot: WideString);
procedure GoCreateFolderDone(Sender: TObject; aHandle: Integer; aCode: Integer);
procedure GoNeedRenameFolder(Sender: TObject; aHandle: Integer; const aPath: WideString; var aOkay: WordBool; var aRoot: WideString);
procedure GoRenameFolderDone(Sender: TObject; aHandle, aCode: Integer);
procedure GoNeedRenameFile(Sender: TObject; aHandle: Integer; const aPath: WideString; var aOkay: WordBool; var aRoot: WideString);
procedure GoRenameFileDone(Sender: TObject; aHandle, aCode: Integer);
procedure GoNeedDeleteFolder(Sender: TObject; aHandle: Integer; const aPath: WideString; var aOkay: WordBool; var aRoot: WideString);
procedure GoDeleteFolderDone(Sender: TObject; aHandle, aCode: Integer);
procedure GoNeedDeleteFile(Sender: TObject; aHandle: Integer; const aPath: WideString; var aOkay: WordBool; var aRoot: WideString);
procedure GoDeleteFileDone(Sender: TObject; aHandle, aCode: Integer);
procedure GoDownloadClientDone(Sender: TObject; aHandle, aCode: Integer);
procedure GoDownloadClientProgress(
procedure GoNeedDownload(Sender: TObject; aHandle: Integer; const aPath: WideString; var aOkay: WordBool; var aRoot: WideString);
procedure GoDownloadServerDone(Sender: TObject; aHandle, aCode: Integer);
procedure GoClientUploadDone(Sender: TObject; aHandle, aCode: Integer);
procedure GoUploadClientProgress(Sender: TObject; aHandle, aCountLo, aCountHi, aSizeLo, aSizeHi: Integer);
procedure GoNeedUpload(Sender: TObject; aHandle: Integer; const aPath: WideString; var aOkay: WordBool; var aRoot: WideString);
procedure GoServerUploadDone(Sender: TObject; aHandle, aCode: Integer);
procedure GoNeedZip(Sender: TObject; aHandle: Integer; const aPath: WideString; var aOkay: WordBool; var aRoot: WideString);
procedure GoZipProgress(Sender: TObject; aHandle, aFileCount, aFileTotal, aByteCountLo, aByteCountHi, aByteTotalLo, aByteTotalHi: Integer);
procedure GoClientZipDone(Sender: TObject; aHandle, aCode: Integer);
procedure GoServerZipDone(Sender: TObject; aHandle, aCode: Integer);
procedure GoNeedUnzip(Sender: TObject; aHandle: Integer; const aPath: WideString; var aOkay: WordBool; var aRoot: WideString);
procedure GoUnzipProgress(Sender: TObject; aHandle, aFileCount, aFileTotal, aByteCountLo, aByteCountHi, aByteTotalLo, aByteTotalHi: Integer);
procedure GoClientUnzipDone(Sender: TObject; aHandle, aCode: Integer);
procedure GoServerUnzipDone(Sender: TObject; aHandle, aCode: Integer);
procedure GoNeedSearch(Sender: TObject; aHandle: Integer; const aPath: WideString; var aOkay: WordBool; var aRoot: WideString);
procedure GoHaveFindFile(Sender: TObject; aHandle: Integer; const aName: WideString; aSizeLo, aSizeHi, aTimeLo, aTimeHi: Integer);
procedure GoSearchProgress(Sender: TObject; aHandle, aCount: Integer);
procedure GoClientSearchDone(Sender: TObject; aHandle, aCode: Integer);
procedure GoServerSearchDone(Sender: TObject; aHandle, aCode: Integer);
public
{ Public declarations }
SelPeer: TPeer;
P2pAgent: TP2PAgent;
MyPeers: TObjectList;
procedure CheckError(aCode: Integer);
end;
var
fMain: TfMain;
function Make64(aLo, aHi: Integer): Int64;
function FileTimeToDateTime(FileTime: TFileTime): TDateTime;
function FileTimeToText(aFileTime: TFileTime): String;
function SizeStr(aSize: Int64): String;
implementation
uses uAdd, uConnect, uRights, Tools;
{$R *.DFM}
function SizeStr(aSize: Int64): String;
var
i,j: Integer;
S: String;
begin
Result := '';
S := IntToStr(aSize);
i := Length(S);
j := 3;
while i > 0 do
begin
if j = 0 then
begin
Result := ',' + Result;
j := 3;