Ok, cool!! Ich hab das aber mit dem User herausfinden noch nicht ganz gerafft.
Mein Delphi kennt beim Server die Funktion GetUserFromSocket
nicht. Was mache ich falsch bzw. wie komme ich dann an die Verbindung ran?
Wie xZise schreibt, die musst du selber erstellen ... ich bin aber (nach dem was du hier geschrieben hast) davon ausgegangen, dass du schon so eine Liste führst (User,Socket). Die Funktion sucht dann aus der Liste den Socket und liefert den User.
Auch finde ich im Moment "TServerWinSocket" nicht ... ich habe die ganze Weiterleitung etc. in OnClientRead (ist das korrekt?), da gibt es aber nur ...ClientRead(Sender: TObjet; Socket: T[B]Custom[/B]WinSocket);
.
Und: ( Socket <> TServerWinSocket( Sender ).Connections[ idx ] ) then
--> ist Socket nicht gleich TServerWinSocket??
Du hast doch eine TServerSocket-Komponente auf deiner Form liegen. Ich weiß nicht wie die heißt ... ist aber auch egal.
Nehmen wir mal an, die heißt ServerSocket1, dann hätte ich auch schreiben können
ServerSocket1.Connections[ idx ]
aber sowas ist immer doof, denn wenn du die Komponente umbenennst, dann funktioniert dein Code nicht mehr.
In dem Parameter Sender habe ich den Verweis auf die Komponente die diese Methode aufruft, und das ist deine TServerSocket (wie immer die auch heißen mag). Durch die Vererbung (
OOP) brauche ich die Sicht auf TServerWinSocket (davon ist TServerSocket abgeleitet), denn ab da kann ich auf die Connections zugreifen.
Sender ist aber erst mal vom Typ TObject (siehst du an der Definition der Methode
procedure ClientRead(Sender: TObject; Socket: TCustomWinSocket);
). Darum benötige ich/du einen TypeCast und den macht man mit
TServerWinSocket( Sender )
. Jetzt kannst du deine Komponente auch in
RudiRüsselSeineSocketKomponente
umbenennen und es (diese Methode) wird immer noch funktionieren (in D2010 kann man auch ein ü im Namen haben).
Ich hätte auch
TServerSocket( Sender )
nehmen können, es ist aber besser immer die niedrigste benötigte Ableitung im TypeCast zu verwenden. Das wirst du merken, wenn du mal etwas mehr mit
OOP arbeitest
Soweit zum TypeCast
( Socket <> TServerWinSocket( Sender ).Connections[ idx ] )
Hier die Bedeutung der einzelnen Elemente:
Socket
-> Verbindung zum Client, von dem aktuell die Nachricht empfangen wird
TServerWinSocket( Sender ).Connections
-> Liste mit allen Verbindungen zum Server
TServerWinSocket( Sender ).Connections[ idx ]
-> Verbindung zu einem Client
Innerhalb der for-Schleife (idx) prüfe ich, ob die Verbindung[ idx ] = der Verbindung des Clients ist von dem aktuell die Nachricht empfangen wird, weil dem will ich die Nachricht ja nicht mehr schicken.
Der bekommt im Anschluss zwar auch eine Nachricht, aber mit einer anderen Intention.