Разработка аналога системы p2p

Автор работы: Пользователь скрыл имя, 17 Декабря 2011 в 13:04, курсовая работа

Описание работы

В данном курсовом проекте разработана программа-аналог системы p2p. Данная программа создана в среде Delphi версии 7.0. Программа представляет собой комплекс средств для обмена файлами между пользователями в сети, включающий в себя хаб, клиентское приложение, поиск нужных файлов, предоставление доступа к информации, чат между пользователями. Наряду с этим, в программе реализованы права доступа на действия с файлами пользователей.

Содержание работы

Введение 5
1. Анализ технического задания 7
2. Реализация 13
3. Тестирование 13
Заключение 18
Список литературы 19

Файлы: 1 файл

Пояснительная записка.doc

— 596.50 Кб (Скачать файл)

    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.Text, 0);

  P2pHub.ListeningPort := StrToIntDef(fSettings.edPort.Text, 0);

  P2pHub.SecurityMode := fSettings.SecurityMode;

  P2pHub.PublicKey := fSettings.mmPublic.Text;

  P2pHub.PrivateKey := fSettings.mmPrivate.Text;

  P2pHub.SecretKey := fSettings.edSecret.Text;

  P2pHub.Fingerprints := fSettings.lstFingerprints.Items.CommaText;

  P2pHub.ListeningPort := StrToIntDef(fSettings.edPort.Text, 0);

  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.ListItem.Index);

  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.Handle);

  end;

  UpdateStatus;

  LogMsg('Хаб остановлен');

end;

procedure TfMain.btnSettingsClick(Sender: TObject);

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.LocalIPList);

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.Handle);

end;

procedure TfMain.GoConnectionRequest(Sender: TObject; aHandle: Integer; const aUsername: WideString; var aPassword: WideString; var aAccept: WordBool);

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(aHandle));

  LI.Subitems.Add(P2pHub.GetPeerAddress(aHandle));

  LI.Subitems.Add(IntToStr(P2pHub.GetPeerPort(aHandle)));

  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(Sender: TObject; aHandle, aCode: Integer);

var

  Pr: TPeer;

begin

  Pr := TPeer(P2pHub.GetMoniker(aHandle));

  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;

Информация о работе Разработка аналога системы p2p