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:
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;
Das wäre jetzt ein simple Broadcast durch den Client an alle weiteren angeschlossenen Clients.
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:
procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
AThread.Data := TClient.Create(AThread);
end;
Wenn sich der Client trennt, dann muss das Objekt wieder zerstört werden.
Delphi-Quellcode:
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;
Jetzt musst Du nur noch darauf achten, wenn der Client eine Nachricht sendet
Delphi-Quellcode:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
begin
if AThread.Data <> nil then
if AThread.Data is TClient then
TClient(AThread.Data).Execute;
end;
Achtung: Sämtlicher Code ist nicht getestet. Für Fehler keine Gewähr.
Einfach nur mal zusammengetippt.