Автор работы: Пользователь скрыл имя, 17 Декабря 2011 в 13:04, курсовая работа
В данном курсовом проекте разработана программа-аналог системы p2p. Данная программа создана в среде Delphi версии 7.0. Программа представляет собой комплекс средств для обмена файлами между пользователями в сети, включающий в себя хаб, клиентское приложение, поиск нужных файлов, предоставление доступа к информации, чат между пользователями. Наряду с этим, в программе реализованы права доступа на действия с файлами пользователей.
Введение 5
1. Анализ технического задания 7
2. Реализация 13
3. Тестирование 13
Заключение 18
Список литературы 19
btnStop: TButton;
btnSettings: TButton;
btnUsers: TButton;
btnMyIP: TButton;
btnExit: TButton;
btnBytes: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure btnExitClick(Sender: TObject);
procedure btnMyIPClick(Sender: TObject);
procedure lvPeersChange(Sender: TObject; Item: TListItem; Change: TItemChange);
procedure FormShow(Sender: TObject);
procedure btnRemoveClick(Sender: TObject);
procedure btnSettingsClick(Sender: TObject);
procedure btnUsersClick(Sender: TObject);
procedure btnStartClick(Sender: TObject);
procedure btnStopClick(Sender: TObject);
procedure btnBytesClick(Sender: TObject);
private
{ Private declarations }
MyPeers: TObjectList;
procedure LoadForm;
procedure SaveForm;
procedure SetSettings;
procedure LogMsg(aText: String);
procedure UpdateStatus;
procedure DeletePeer(aPeer: TPeer);
procedure GoConnectionRequest(Sender: TObject; aHandle: Integer; const aUsername: WideString; var aPassword: WideString; var aAccept: WordBool);
procedure GoPeerConnected(Sender: TObject; aHandle: Integer);
procedure GoPeerRejected(Sender: TObject; const aUsername: WideString; const aAddress: WideString; aPort, aCode: Integer);
procedure GoPeerDisconnected(Sender: TObject; aHandle, aCode: Integer);
procedure GoBinaryMessage(Sender: TObject; aHandle: Integer; var aValue: OleVariant);
public
{ Public declarations }
P2pHub: TP2pHub;
end;
var
fMain: TfMain;
implementation
uses uSettings, uAdd, uUsers;
{$R *.DFM}
procedure TfMain.FormCreate(Sender: TObject);
begin
LoadForm;
MyPeers := TObjectList.Create;
P2pHub := TP2pHub.Create(Self);
P2pHub.OnConnectionRequest := GoConnectionRequest;
P2pHub.OnPeerConnected := GoPeerConnected;
P2pHub.OnPeerRejected := GoPeerRejected;
P2pHub.OnPeerDisconnected := GoPeerDisconnected;
P2pHub.OnBinaryMessage := GoBinaryMessage;
end;
procedure TfMain.FormDestroy(Sender: TObject);
begin
SaveForm;
MyPeers.Free;
end;
procedure TfMain.FormShow(Sender: TObject);
begin
SetSettings;
btnStart.Click;
end;
procedure TfMain.LoadForm;
var
Ini: TIniFile;
begin
try
Ini := TIniFile.Create(ConfFile);
except
Ini := nil;
end;
if Ini
= nil then Exit;
try
with Ini do
begin
Left := ReadInteger('Last', 'Left', Left);
Top := ReadInteger('Last', 'Top', Top);
end;
finally
Ini.Free;
end;
end;
procedure TfMain.SaveForm;
var
Ini: TIniFile;
begin
try
Ini := TIniFile.Create(ConfFile);
except
Ini := nil;
end;
if Ini = nil then Exit;
try
with Ini do
begin
WriteInteger('Last', 'Left', Left);
WriteInteger('Last', 'Top', Top);
end;
finally
Ini.Free;
end;
end;
procedure TfMain.SetSettings;
begin
P2pHub.ListeningPort
:= StrToIntDef(fSettings.edPort.
P2pHub.ListeningPort
:= StrToIntDef(fSettings.edPort.
P2pHub.SecurityMode := fSettings.SecurityMode;
P2pHub.PublicKey := fSettings.mmPublic.Text;
P2pHub.PrivateKey := fSettings.mmPrivate.Text;
P2pHub.SecretKey := fSettings.edSecret.Text;
P2pHub.Fingerprints
:= fSettings.lstFingerprints.
P2pHub.ListeningPort
:= StrToIntDef(fSettings.edPort.
P2pHub.BindAddress := fSettings.edSrvAddr.Text;
UpdateStatus;
end;
procedure TfMain.LogMsg(aText: String);
begin
mmLog.Lines.Add(TimeToStr(Now) + ': ' + aText);
end;
procedure TfMain.UpdateStatus;
begin
if P2pHub.Running then
begin
StatusBar.Panels[0].Text := ' Запуск';
btnStart.Enabled := False;
btnStop.Enabled := True;
end
else
begin
StatusBar.Panels[0].Text := ' Остановка';
btnStart.Enabled := True;
btnStop.Enabled := False;
end;
if lvPeers.Items.Count = 0 then
StatusBar.Panels[1].Text := ' Нет активных соединений'
else
StatusBar.Panels[1].Text := ' ' + IntToStr(lvPeers.Items.Count) + ' соедиение';
end;
procedure TfMain.DeletePeer(aPeer: TPeer);
begin
if aPeer = nil then Exit;
lvPeers.Items.Delete(aPeer.
MyPeers.Remove(aPeer);
end;
procedure TfMain.btnStartClick(Sender: TObject);
begin
if P2pHub.Start then
LogMsg('Хаб запущен')
else
ShowMessage('Невозможно
UpdateStatus;
end;
procedure TfMain.btnStopClick(Sender: TObject);
var
Pr: TPeer;
i: Integer;
begin
P2pHub.Stop;
for i := lvPeers.Items.Count-1 downto 0 do
begin
Pr := TPeer(lvPeers.Items[i].Data);
P2pHub.DisconnectPeer(Pr.
end;
UpdateStatus;
LogMsg('Хаб остановлен');
end;
procedure TfMain.btnSettingsClick(
begin
if fSettings.ShowModal <> mrOk then Exit;
SetSettings;
end;
procedure TfMain.btnUsersClick(Sender: TObject);
begin
fUsers.ShowModal;
end;
procedure TfMain.btnMyIPClick(Sender: TObject);
begin
ShowMessage(P2pHub.
end;
procedure TfMain.btnExitClick(Sender: TObject);
begin
Application.Terminate;
end;
procedure TfMain.lvPeersChange(Sender: TObject; Item: TListItem; Change: TItemChange);
begin
if Change <> ctState then Exit;
btnRemove.Enabled := lvPeers.SelCount = 1;
btnBytes.Enabled := lvPeers.SelCount = 1;
UpdateStatus;
end;
procedure TfMain.btnRemoveClick(Sender: TObject);
var
Pr: TPeer;
begin
if lvPeers.Selected = nil then Exit;
Pr := TPeer(lvPeers.Selected.Data);
P2pHub.DisconnectPeer(Pr.
end;
procedure TfMain.GoConnectionRequest(
begin
aPassword := fUsers.GetPassword(aUsername);
aAccept := True;
end;
procedure TfMain.GoPeerConnected(Sender: TObject; aHandle: Integer);
var
LI: TListItem;
Pr: TPeer;
begin
Pr := TPeer.Create;
MyPeers.Add(Pr);
Pr.Handle := aHandle;
LI := lvPeers.Items.Add;
LI.Data := Pointer(Pr);
Pr.ListItem := LI;
LI.Caption
:= CheckName(P2PHub.GetPeerName(
LI.Subitems.Add(P2pHub.
LI.Subitems.Add(IntToStr(
LI.Subitems.Add(TimeToStr(Now)
LI.Subitems.Add('Соединен');
P2pHub.SetMoniker(aHandle, Integer(Pr));
UpdateStatus;
LogMsg('Новый пользователь ' + LI.SubItems[0] + ':' + LI.SubItems[1]);
end;
procedure TfMain.GoPeerRejected(Sender: TObject; const aUsername: WideString; const aAddress: WideString; aPort, aCode: Integer);
begin
LogMsg('Пользователь отклонен: ' + aUsername + ' с ' + aAddress + ':' + IntToStr(aPort) + ' Ошибка- ' + IntToStr(aCode));
end;
procedure TfMain.GoPeerDisconnected(
var
Pr: TPeer;
begin
Pr :=
TPeer(P2pHub.GetMoniker(
if Pr = nil then Exit;
LogMsg('Отключен пользователь' + Pr.Username + ' Ошибка-' + IntToStr(aCode));
DeletePeer(Pr);
end;
procedure TfMain.btnBytesClick(Sender: TObject);
var
Pt: OleVariant;
P: PByte;
S: String;
begin
S := DateTimeToStr(Now);
Pt := VarArrayCreate([0, Length(S)-1], varByte);
P := VarArrayLock(Pt);
if P = nil then Exit;