Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi [Indy 10]: mehrere Clients mit TCP-Server verwalten (https://www.delphipraxis.net/93286-%5Bindy-10%5D-mehrere-clients-mit-tcp-server-verwalten.html)

Rindajel 3. Jun 2007 20:47


[Indy 10]: mehrere Clients mit TCP-Server verwalten
 
Hallo zusammen,

ich arbeite derzeit an einem Multiplayerspiel über LAN unter Benutzung der TCP Server- und Clientkomponenten. Bis jetzt habe ich immer nur einen Client mit dem Server verbunden, klappt auch wunderbar. Aber wie funktioniert das jetzt mit mehreren Clients?
Ich muss dazu sagen, dass es mein erstes Projekt mit Indy (bzw. mein erstes Netzwerkprojekt überhaupt) ist, daher ein paar generelle Fragen:

Wo speichert der Server die verschiedenen Verbindungen, wie kann ich darauf zugreifen und sie ggf. unterscheiden?
Wie kann ich einen String gleichzeitig (bzw. nacheinander in einer Zählschleife) an alle verbundenen Clients senden?

Habe schon gegooglet und auch hier im Forum gesucht, bin aber nicht viel weitergekommen? Gibt es vllt. eine Chat-Demo für Indy 10?

Danke schon im Voraus,
Gruß Rindajel

alzaimar 3. Jun 2007 22:17

Re: [Indy 10]: mehrere Clients mit TCP-Server verwalten
 
Jeder Client erzeugt einen eigenen Thread. Über die Data-Eigenschaft des TIdPeerThread kannst Du im OnConnect-Ereignis des Servers ein Datenmodul instantiieren (ob das nun von TDatamodule abgeleitet ist oder nicht, ist irrelevant) und dann die Daten der Connection in diesem Objekt speichern. Wenn deine Anwendung dagegen sessionbasiert ist, benötigst du einen threadsicheren Container sowie eine Session-ID. Das kann z.B. eine GUID sein. Dein Container kann eine TStringlist sein, die natürlich mit ggeigneten Verfahren threadsicher gemacht wird.

Rindajel 4. Jun 2007 19:56

Re: [Indy 10]: mehrere Clients mit TCP-Server verwalten
 
Danke für die Antwort, aber um ehrlich zu sein, habe ich von dem, was du geschrieben hast, nicht einmal die Hälfte verstanden. Kannst du es bitte nochmal für Idioten beschreiben?? Wenn möglich auch mit Codebeispielen, vor allem für das OnConnect Ereignis und wie dann Daten an alle Clienten verschickt werden.
Mein OnConnect sieht derzeit so aus:
Delphi-Quellcode:
procedure TForm1.IdTCPServer1Connect(AContext: TIdContext);
begin
AContext.Connection.IOHandler.WriteLn('100 Connected');
AContext.Data:=TUserData.Create;
end;
Ist nicht viel, ich habe es auch nur wo rauskopiert.

Für was ist eigentlich die Bindings Eigenschaft des Servers verantwortlich? Kann ich die Clients nicht auch darüber ansprechen?

Gruß, Rindajel


EDIT: Ich habe versucht, es anhand einer Indy 9 Demo nachzuvollziehen, mein OnConnect sieht jetzt so aus:
Delphi-Quellcode:
procedure TForm1.IdTCPServer1Connect(AContext: TIdContext);
var response:String;
    Client:TUserData;
begin
response:='100 Connected';
AContext.Connection.IOHandler.WriteLn(response);
Client:=TUserData.Create;
Client.Host:=AContext.Connection.Socket.Host;  {Greife ich so auf den Host zu, oder geht das über AContext.Connection.IOHandler.Host ??}
Client.Port:=AContext.Connection.Socket.Port; //das selbe wie beim Host
{Client.Thread:=AContext.}  //wie weise ich den Thread zu?
Clients.Add(Client);
{AContext.Data:=TUserData.Create;}
Memo1.Lines.Add('***Verbindung hergestellt mit ' + Client.Host + '***');
Memo1.Lines.Add('Sende ' + response);
end;
Die entsprechende Klasse TUserData sieht so aus:
Delphi-Quellcode:
TUserData = class
  public
    Host:String;
    Port:Integer;
    Thread:Pointer;
  end;
Clients ist eine TList ...

Gruß, Rindajel


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:48 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