Einzelnen Beitrag anzeigen

Preddy2005

Registriert seit: 27. Nov 2005
Ort: Mettmann
38 Beiträge
 
#2

Re: Hilfe bei der Verwendung von TClientSocket und TServerSo

  Alt 10. Apr 2006, 22:00
Ok ich habe das jetzt alles halbwegs verstanden... Aber ich habe ein anderes Problem. Vielleicht kann mir damit jemand helfen... Es kommt irgendwie beim Senden des Memorystreams nichts an. Vorher hat es immerhin funktioniert. Nur jetzt nicht mehr.Wieso?
Vielleicht ist die Methode ja auch einfach nur falsch wie ich sende...

Hier mal der Code :

Delphi-Quellcode:

procedure TfrmClient.ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);

var
 Antwort : String; // Antwort vom Server
 Aktion : String; // Clientaktion
 Laenge : Integer; // Laenge des Streams
 Buffer : PChar; // Buffer für den Stream
 BenutzerListeStream : TMemoryStream; // Der empfangene Datenstrom

begin

 Antwort := Socket.ReceiveText; // Antwort vom Server
 Aktion := Copy(Antwort,1,4); // Das AUTH kopieren

   if (Aktion = 'AUTH') then // Erfolgreich authentifiziert
    begin
     frmLog.memLog.Lines.Add('User + Passwort korrekt'); // Memoeintrag hinzufügen
     BenutzerListeStream := TMemoryStream.Create; // Memorystream erzeugen
     Laenge := Socket.ReceiveLength; // Laenge des Streams
     GetMem(Buffer, Laenge); // Speicher adressieren
     try
      Socket.ReceiveBuf(Buffer^, Laenge); // Den Stream im Buffer speichern
      BenutzerListeStream.Position := 0; // Position des Streams auf 0 setzen
      // Daten des Streams in den Buffer schreiben
      BenutzerListeStream.WriteBuffer(Buffer^,Laenge);
      // Die Daten des Streams in eine Datei schreiben
      BenutzerListeStream.SaveToFile(ExtractFilePath(Application.Exename) + '\User' + '\Benutzerliste.txt');
      frmLog.memLog.Lines.Add('Benutzerliste erhalten'); // Memoeintrag hinzufügen


      Benutzerliste := TStringList.Create; // Benutzerliste erzeugen
      frmLog.memLog.Lines.Add('Benutzerlistenobjekt erzeugt.');

        // Benutzerliste laden und Logfenstereintraege erstellen

      Benutzerliste.LoadFromFile(ExtractFilePath(Application.Exename) + 'User' + '\Benutzerliste.txt');
      frmLog.memLog.Lines.Add('Benutzerliste geladen.');
      frmLog.memLog.Lines.Add('');
      frmLog.memLog.Lines.Add('Inhalt : ');
      frmLog.memLog.Lines.Add('');
      frmLog.memLog.Lines.Add(Benutzerliste.Text);
      Benutzerliste.Free;

      finally
       FreeMem(Buffer); // Speicher freigeben
      end
     end;
end;
und hier der Code vom Serversocket...

Delphi-Quellcode:

procedure TForm1.sktServerClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
Var

  Anfrage : String; // Anfrage : `´%]
  AnfrageString : String; // Temporäre Variable für Socket.ReceiveText
  UserName : String; // Für den Benutzernamen
  Passwort : String; // Für das Passwort
  Trennzeichen : String; // Für das 1te Komma nach der Anfrage
  Trennzeichen2 : String; // Für das 2te Komma nach dem Namen
  Trenner : Integer; // Funktion POS (Kommastelle ermitteln)
  i : Integer; // Zählvariable
  UserListeStream : TMemoryStream; // Stream für das Senden der Userliste
  Verbundene_Benutzer : TstringList; // Liste für verbundene Benutzer

begin

   i := 0;

    // Sockettext muss zwischengespeichert werden
  AnfrageString := Socket.ReceiveText;
  memLog.Lines.Add(Socket.ReceiveText);

        // Anfrage [4 Zeichen kopieren]

  Anfrage := copy(AnfrageString,1,4);

{*******************************************************************************
                      Anfrage  =  `´%]
*******************************************************************************}


   if (Anfrage = '`´%]') then
    begin
     memLog.Lines.Add('Loginabfrage:');

            // Anfragstringformat : `´%],Name,Passwort

                  // 1te Komma kopieren
     Trennzeichen := copy(AnfrageString,5,1);

            // Zeichen `´%], löschen

     delete(AnfrageString,1,5);

           // 2te Kommastelle aus dem Reststring ermitteln

     Trenner := pos(',',AnfrageString);

              // Username bis zum Komma kopieren

     Username := copy(AnfrageString,1,Trenner-1);

                 // 2te Komma kopieren

     Trennzeichen2 := copy(AnfrageString,Trenner,1);

                  // Passwort kopieren

     Passwort := copy(AnfrageString,Trenner+1,Length(AnfrageString));

                        // Zur Kontrolle

     if Trennzeichen = ',then memLog.Lines.Add(',');
     if Trennzeichen2 = ',then memLog.Lines.Add('2ter,');
     if Anfrage = '`´%]then memLog.Lines.Add('`´%]');
     if Username = 'Matthiasthen memLog.Lines.Add(Username);
     if Passwort = '819777then memLog.Lines.Add(Passwort);

  { Ist das Anfrageformat korrekt gewesen , dann erfolgt die Passwortprüfung }

                           // Passwort prüfen

                        // Stringlisten erzeugen

     slLoginListe := TStringList.Create; // Temporäre Liste als Zwischenspeicher
     slUser := TStringList.Create; // Für User
     slPasswort := TStringList.Create; // Für Passwort

             { Inhalt aus der Datei in die Stringliste laden
                          FORMAT : Name,Passwort }


     slLoginListe.LoadFromFile(ExtractFilePath(Application.Exename) + 'Login' + '\Login.txt');

    repeat

       // Kommastelle in der temporären Stringliste finden

   Trenner := pos(',',slLoginListe.Strings[i]);

      { Bis zum Trennzeichen (,) den Namen kopieren und in die Stringliste
                        für die Benutzer hinzufügen }


   User_Liste := copy(slLoginListe.Strings[i],0,Trenner-1);
   slUser.Add(User_Liste);

        // Nach dem Trennzeichen (,) kopieren

   Leerzeichen := pos(' ', slLoginListe.Strings[i]);

         // Bis zum Ende des Strings kopieren [Passwort])

   Passwort_Liste := copy(slLoginListe.Strings[i],Trenner+1,length(slLoginListe.Strings[i]));
   slPasswort.Add(Passwort_Liste);

   i := i + 1;

   until ( i >= slLoginListe.Count); // Für die Anzahl der Einträge in der Liste

        // Prüfen, ob der Benutzer und das Passwort in der Liste existieren

   for i := 0 to slUser.Count-1 do
    begin
      if (Username = slUser.Strings[i]) then
       begin
        User_Exists := True;
        break;
       end
        else
         begin
          User_Exists := False;
         end;
    end;

   // Wenn User nicht existiert, dann dem Client 'Error' senden

      if User_Exists = False then Socket.SendText('ERROR');

            // Wenn Benutzer existiert, dann Passwort prüfen

       if ( User_Exists = True ) then
         for i := 0 to slPasswort.Count-1 do
          begin
            if (Passwort = slPasswort.Strings[i]) then
             begin
              Passwort_Korrekt := True;
              break;
             end
              else
               begin
                Passwort_Korrekt := False;
               end;
       end;

       // Wenn das Passwort korrekt war, dann

  if Passwort_Korrekt = True then
   begin
    UserListeStream := TMemoryStream.Create; // Memorystream erzeugen

           // Datei aus dem User - Verzeichnis in den Stream laden

    UserListeStream.LoadFromFile(ExtractFilePath(Application.Exename) + '\User' + '\Benutzer.txt');
    MemLog.Lines.Add(Socket.ReceiveText); // Logeintrag im Memo
    UserListeStream.Position := 0; // Position im Stream auf den Anfang setzen
    Socket.SendText('AUTH'); // Ok zurücksenden
    Socket.SendStream(UserListeStream); // Stream an den Client senden
   end
    else Socket.SendText('ERROR');
   end
Vielleicht kann mir irgendjemand ja helfen und sagen was hierbei schief geht oder was ich anders machen muss...

Danke im voraus

Matthias
  Mit Zitat antworten Zitat