Einzelnen Beitrag anzeigen

Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#2
  Alt 10. Dez 2002, 11:56
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.
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat