Registriert seit: 27. Nov 2005
Ort: Mettmann
38 Beiträge
|
Re: Hilfe bei der Verwendung von TClientSocket und TServerSo
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 = 'Matthias' then memLog.Lines.Add(Username);
if Passwort = '819777' then 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
|