Einzelnen Beitrag anzeigen

Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#1

Verwaltung der Clientthreads mit IdTCPServer

  Alt 18. Sep 2004, 21:08
Kurz zur Geschichte:
Ich wollte einen Chat erstellen, an dem mehrere Leute teilhaben können.
Auch nach den Indy-Beispielen war mir die Verwaltung der Clients auf dem Server ein Rätsel.
Also beschloß ich, mir eine Klase zu coden, welche die Clientthread-Verwaltung für mich übernimmt.

Hier ist sie:

Benötigt:
Indys
TIdTCPServer
TIdTCPClient

Sie enthält folgendes:

Add: Um einen Thread hinzuzufügen
Delete: Um einen Thread zu entfernen
Clients (Default) um den Thread eines Clients zu bekommen
IndexOf um den Index zu einem Thread zu bekommen
Count um die Anzahl der verbundenen Clients festzustellen
Broadcast um an alle verbunden Clients einen Record vom Typ TMessageRecord zu schicken
(Letzeres bei Bedarf anpassen)

Eine Nachricht an einen Client senden:
Delphi-Quellcode:
  TClients = class (TObject)
               constructor Create;
              private
               ArrCount: Byte;
               ClArray: Array[1..32] of TIdPeerThread;
               function GetClient (id: integer): TIdPeerThread;
              public
               procedure Add (Thread: TIdPeerThread);
               procedure Delete (id: integer);
               procedure Broadcast (MessageRecord: TMessageRecord);
               function IndexOf (Thread: TIdPeerThread): integer;
               property Count: Byte read ArrCount;
               property Clients[id: integer]: TIdPeerThread read GetClient; default;
             end;

var
  Form1: TForm1;
  clients: TClients;
 
implementation

{$R *.dfm}

constructor TClients.Create;
var
  i: Byte;
begin
  inherited Create;
  ArrCount := 0;
  for i := 1 to 32 do ClArray[i] := nil ;
end;

function TClients.GetClient (id: integer): TIdPeerThread;
begin
  Result := nil;
  if (id < 1) or (id > 32) then exit;
  Result := ClArray[id];
end;

procedure TClients.Add (Thread: TIdPeerThread);
var
  i: Byte;
begin
  for i := 1 to 32 do
  begin
    if ClArray[i] = nil then
    begin
     ClArray[i] := Thread;
     inc (ArrCount);
     exit;
    end;
  end;
end;

procedure TClients.Delete (id: integer);
var
  i: Byte;
begin
  if (id < 1) or (id > 32) or (ClArray[id] = nil) then exit;

  ClArray[id] := nil;
  dec (ArrCount);

  for i := id to 32 do
  begin
    if ClArray[i] <> nil then ClArray[i-1] := ClArray[i];
  end;
end;

procedure TClients.Broadcast (MessageRecord: TMessageRecord);
var
  i: Byte;
begin
  for i := 1 to 32 do
  begin
    try
      if ClArray[i] <> nil then ClArray[i].Connection.WriteBuffer(MessageRecord, SizeOf(MessageRecord), True);
    except
    end;
  end;
end;

function TClients.IndexOf (Thread: TIdPeerThread): integer;
var
  i: Byte;
begin
  Result := 0;
  if (Thread = nil) then exit;
  for i := 1 to 32 do
  begin
    if ClArray[i] = Thread then
    begin
      Result := i;
      break;
    end;
  end;
end;
Die Maximale Anzahl von Clients beträgt hier 32, bei Bedarf einfach überall die 32 ersetzen.

[edit=Chakotay1308]Von jfheins korrigierte Version eingefügt. Mfg, Chakotay1308[/edit]
[edit=Matze]Code formatiert. Mfg, Matze[/edit]
  Mit Zitat antworten Zitat