Ich glaube, ich muß mein Problem noch mal etwas anschaulicher formulieren.
wenn man eine TServerSocket-Kompo auf seinem Formular platziert, dann kann man über diverse Ereignisse Informationen über die Aktivitäten der verbundenen Clients erhalten. Als Beispiel sei hier das Ereignis OnClientRead genannt. dieses ist wie folgt deklariert:
Delphi-Quellcode:
property OnClientRead: TSocketNotifyEvent;
type TSocketNotifyEvent = procedure (Sender: TObject; Socket: TCustomWinSocket) of object;
Möchte man z.B. an den empfangenen Text kommen, so ruft man die ReceiveText-funktion des übergebenen Objektes Socket auf.
diese instanz von Socket "lebt" so lange, wie der Client Connected ist. Das heißt also, das das
Handle der socket beim nächten OnClientRead-Ereignis das selbe ist. Logisch!
Da ich einen spezialisierten Nachfahren von TServerSocket (implizit auch der ClientSockets) haben möchte, leite ich hier erst mal meine eigenen Klassen ab. irgentwo muß man ja anfangen, also nehme ich mir als erstes die Clients vor. Das erscheint auch recht einfach, da die
OH zum Ereignis OnGetSocket der Kompo TServerSocket folgendes sagt:
Zitat:
Das Ereignis OnGetSocket tritt ein, wenn der Server-Socket ein neues TServerClientWinSocket-Objekt erstellen muß, das den Server-Endpunkt einer Verbindung zu einem Client-Socket repräsentiert.
type
TGetSocketEvent = procedure (Sender: TObject; Socket: TSocket; var ClientSocket: TServerClientWinSocket) of object;
property OnGetSocket: TGetSocketEvent;
Beschreibung
In einer Behandlungsroutine für das Ereignis OnGetSocket können Sie einen spezialisierten Nachkommen von TServerClientWinSocket für die zu verwendende Server-Socket-Komponente erzeugen. Geben Sie das neue TServerClientWinSocket-Objekt im Parameter ClientSocket zurück. Der Parameter Sender enthält das TServerWinSocket-Objekt, das den Server-Endpunkt der empfangenden Verbindung beschreibt.
Tolle sache, ich schaffe mir also meinen eigenen Nachfahren meiner ClientSocket, übergebe sie im OnGetSocket-Ereignis und kann jetzt in den TserverSocket-Ereignissen in denen Socket übergeben wird auf meine eigenen Member zugreifen.
Warum mache ich das? aus folgendem Grund. Meine Clients senden nach einem Connect spezielle Infos, mit denen sie identifiziert werden können. Der Einfachheit halber lege ich welche fest:
Delphi-Quellcode:
TBaseGPRSServerClientWinSocket = class(TServerClientWinSocket)
private
FConnectTime: TDateTime;
ClientID : Integer;
ClientName : string;
...
protected
procedure Event(Socket: TCustomWinSocket; SocketEvent: TSocketEvent); override;
public
...
Für mich entsteht dabei folgender Vorteil. Connected sich ein neuer Client, so übergebe ich im OnGetSocket-Ereignis eine neue Instanz meiner speziellen TBaseGPRSServerClientWinSocket. Bekomme ich im ersten Read die Anmeldeinfos, so trage ich die entsprechenden Werte bei den Membern ein. Also empfangenen Wert nach ID und Name durchsuchen und in FClientID und FClientName merken. Die erfolgt dann aber nicht im OnClientRead-Ereignis der TServerSocket, sondern im überschriebenen Event der TBaseGPRSServerClientWinSocket.
"Oben" merkt somit keiner, das sich der Client identifiziert hat, was so auch gewollt ist. Jedes weitere Empfangen von Text kann jetzt zusätzlich mit den Ident-infos meiner ClientSocket vervollständigt werden ohne sie jedes mal neu zu senden.
Kurz und knapp heißt das also, wenn meine ServerSocket eh schon eine Liste aller verbundenen Clients führt (repräsentiert durch die TBaseGPRSServerClientWinSocket), dann merke ich mir alles notwendige direkt da.
Ja, die Idee fand ich gut; und klappen tut's auch.
wie ihr bereits mitbekommen habt, geht es mir um die Decodierung spezieller Sequenzen meiner sendenden Clients. Hier hab ich jetzt min. 2 unterschiedliche Gruppen von Meldungen, Befehlsfolgen und allg. Textnachrichten. Parallel möchte ich auch noch den empfangenen Text im Urzustand liefern. Nichts liegt näher, als hierfür spezielle Ereignisse vorzusehen. Diese sollen dann nach der Decodierung aufgerufen werden.
Als einfaches Beispiel im Zusammenhang zu meinen Ausführungen könnte man nach dem Empfang der Identifizierungsdaten ein Ereignis OnClientIdentify einfügen.
Und jetzt die alles entscheidende Frage: Wie mach ich das so, das ein neuer Nachfahre einer TserverSocket-Kompo dieses ereignis auch empfängt?
Tja, da waren sie wieder, meine Probleme.
Gruß oki