![]() |
[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 |
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.
|
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:
Ist nicht viel, ich habe es auch nur wo rauskopiert.
procedure TForm1.IdTCPServer1Connect(AContext: TIdContext);
begin AContext.Connection.IOHandler.WriteLn('100 Connected'); AContext.Data:=TUserData.Create; end; 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:
Die entsprechende Klasse TUserData sieht so aus:
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;
Delphi-Quellcode:
Clients ist eine TList ...
TUserData = class
public Host:String; Port:Integer; Thread:Pointer; end; 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