![]() |
Hilfe bei der Verwendung von TClientSocket und TServerSocket
Hallo erstmal!
Ich bräuchte mal ein wenig Hilfe mit den obigen Komponenten.... Ich habe drei Formulare ... Auf 2 Forms sind die ClientSockets und auf einem der Serversocket... Ich habe bei dem einen Formular die Einstellungen in der Ide vorgenommen und kann auch an den Server Daten schicken... Dieser kann auch zurücksenden... Nur wie kann ich dem Server jetzt klarmachen, dass dieser die Daten nicht mehr aus dem Loginform entgegennimmt, sondern von dem Clientsocket aus meinem Hauptformular..? Zur Not kann ich auch Code posten... Im internet habe ich nix gefunden.... Leider arbeite ich in der Schule noch mit Delphi 5 und würde lieber auch die Indy Komponenten benutzen... Vielleicht hat ja jemand Beispielcode. Wäre sehr dankbar über Hilfe. Gruss Matthias |
Re: Hilfe bei der Verwendung von TClientSocket und TServerSo
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:
und hier der Code vom Serversocket... 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;
Delphi-Quellcode:
Vielleicht kann mir irgendjemand ja helfen und sagen was hierbei schief geht oder was ich anders machen muss...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 Danke im voraus Matthias |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz