![]() |
Connection Handling bei Client Server
HI,
bin noch recht frisch in der Delphi Szene. Suche Informationen, wie bei einer Client Server Verbindung via Indy TCPServer / TCPClient die Verbindungen gehändelt werden können. Speziell denke ich da an einen Chat wie bei dem Indy Demo in Delphi 6. Da steige ich leider nicht hinter, was die da alles genau machen. Liegt vieleicht daran, daß ich vieleicht noch zu frisch bin, und noch nicht alles kenne. Würde das aber auch gerne lernen. Also ich bekomme so eine Verbindung hin. Ist nicht das Problem. Will ich jedoch den Client (mehrere) identifizieren, weiß ich nicht wie ich das machen soll. Es sollte also nachher gehen, das ich vom Server einen einzelnen Client eine MSG zukommen lasse, oder auch allen. Dann will ich dem einzelnen Client auch einen Nick zuweisen. Eben alles Chatlike. Wie gesagt, will ich hier keine fertige Lösung, sondern wissen wie man sowas macht. Codeschnipsel sind natürlich willkommen. Primär geht es hier um das verstehen und welche Komponenten man da einsetzt. Vielen Dank jetzt schon für eure Hilfe. Andreas |
Da musst Du ein wenig mit Klassen arbeiten. Neben Deiner Klasse (wahrscheinlich das Hauptformular), welche die Kommunikation über die TIdTCPServer Komponente handelt, musst Du eine weitere Klasse erstellen, welche das Layout für jeden einzelnen Client offenlegt. Kleines Beispiel:
Delphi-Quellcode:
Das wäre jetzt ein simple Broadcast durch den Client an alle weiteren angeschlossenen Clients.
type
TClient = class private FThread: TIdPeerThread; public constructor Create(aThread: TIdPeerThread); procedure Execute; end; constructor TClient.Create; begin inherited Create; FThread := aThread; end; procedure TClient.Execute; var I: Integer; Clients: TList; var I: Integer; Clients: TList; Msg: String; begin Msg := AThread.Connection.ReadLn(#$A, 50); if Msg <> '' then begin List := AThread.Connection.Server.Threads.LockList; try for I := 0 to Pred(List.Count) do if List[I] is TIdPeerThread then if TIdPeerThread(List[I]).Data <> nil then if TIdPeerThread(List[I]).Data is TClient then TClient(TIdPeerThread(List[I]).Data).FThread.Connection.WriteLn( Msg); finally AThread.Connection.Server.Threads.UnlockList; end; end; end; Damit man sich nicht um die Clients selbst kümmern muss, kann man die Möglichkeiten von Indy recht gut ausnutzen. Wenn sich ein neuer Client mit dem Server verbindet reagiert man einfach auf das OnConnect Ereignis, erstellt eine neues Objekt von TClient und verweist das auf die Data Eigenschaft des Threads. Den Rest übernimmt Indy von allein.
Delphi-Quellcode:
Wenn sich der Client trennt, dann muss das Objekt wieder zerstört werden.
procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
begin AThread.Data := TClient.Create(AThread); end;
Delphi-Quellcode:
Jetzt musst Du nur noch darauf achten, wenn der Client eine Nachricht sendet
procedure TForm1.IdTCPServer1Disconnect(AThread: TIdPeerThread);
var Obj: TObject; begin if AThread.Data <> nil then if AThread.Data is TClient then begin Obj := AThread.Data; AThread.Data := nil; Obj.Free; end; end;
Delphi-Quellcode:
Achtung: Sämtlicher Code ist nicht getestet. Für Fehler keine Gewähr. :D Einfach nur mal zusammengetippt.
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
begin if AThread.Data <> nil then if AThread.Data is TClient then TClient(AThread.Data).Execute; end; |
Ufff....
:oops: das ist ja fast so Derp wie das Indy Beispiel:-() Das muß ich mir heute Abend mal zu gemüte führen. Wobei ich jetzt schon weiß, das ich dabei Spass bekomme. Na mal sehen . Andreas |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:49 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 by Thomas Breitkreuz