Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TServerSocket Connections[x] (https://www.delphipraxis.net/25911-tserversocket-connections%5Bx%5D.html)

Random 14. Jul 2004 19:51


TServerSocket Connections[x]
 
Hallo, ich habe eine Frage zum TServerSocket.

Um an eine Verbindung von TServerSocket Text zu verschicken, nehme ich an, dass man diesen Befehl verwendet:
Delphi-Quellcode:
Socket.Socket.Connections[x].SendText(text);
Nun ist mein Problem:
wie finde ich raus welches "x" die jeweilige Verbindung hat? Es war mir möglich mit dem von OnClientRead übergebenen "Socket" durch "Socket.SocketHandle" ein Integer-Handle einzulesen, mit welchem ich die Verbindungen zuordnen kann.
Wie kann ich nun beim Versenden das Handle dem entsprechenden "x" zuordnen?

Muetze1 15. Jul 2004 18:54

Re: TServerSocket Connections[x]
 
Moin!

Connections[] liefert dir eine Instanz vom Typ TCustomWinSocket zurück und das entspricht deinem Socket beim OnClientRead. Somit hast du 2 Möglichkeiten:

1. Im OnClientRead einfach Socket.SendText(); aufrufen und somit gar nicht erst den Socket suchen, da er dir übergeben wird.
2. Eine Schleife über alle Connections[] machen und vergleichen ob Connections[] = Socket ist...

Ich empfehle mal so pauschal die 1. Methode...

MfG
Muetze1

Random 15. Jul 2004 20:31

Re: TServerSocket Connections[x]
 
Nun gut, dies würde vorraussetzen, dass der Server dem Client sofort antwortet. Es geht mir aber vorwiegend darum, die Clients zuordnen und später, vom Server selbstständig ansprechen zu können.

Beispiel: Der Server merkt sich wann sich ein Client angemeldet hat und schreibt ihm nach einer Stunde "du bist jetzt seit einer Stunde angemeldet."

supermuckl 15. Jul 2004 21:25

Re: TServerSocket Connections[x]
 
jo dann tu das handle vom clientsocket zusätzlich in ein record oder klasse und dann kannste damit andere daten verknüpfen..

Random 16. Jul 2004 01:07

Re: TServerSocket Connections[x]
 
Oh, das geht? Gut, danke!

Muetze1 16. Jul 2004 01:31

Re: TServerSocket Connections[x]
 
Moin!

Auf meiner HP liegt ein kleiner Chat rum auf Basis von TClientSocket/TServerSocket. Dort habe ich eine kleine Klasse angelegt pro Benutzer die sich dann den Socket aufnimmt (also die Instanzen Adresse) und darüber kann ich dann leicht die Benutzer zuordnen etc . Die Benutzer-Klasseninstanzen werden in einer eigenen TObjectList Ableitung gehalten die dann auch z.B. Funktionen bietet an alle Nutzer zu senden (alle enthaltenen Instanzen durchlaufen und den Socket haben dann ja die einzelnen Instanzen). Eintragen der Instanz bei OnClientConnect und austragen bei OnClientDisconnect. Klappt wunderbar. Ansonsten einfach mal auf eine HP gehen (Delphi->Projekte) und mal anschauen...

MfG
Muetze1

Random 16. Jul 2004 02:58

Re: TServerSocket Connections[x]
 
Zur Komplettierung dieses Topics möchte ich hier noch den Tip eines Bekannten erwähnen -

man lasse einfach einen Zähler mitlaufen, der bei jedem OnConnect um eins steigt. Der Wert des Zählers wird dann mit den Userdaten gespeichert und entspricht später dem "x" in Connections[x].


Gibts eigentlich irgendwo eine Komplettlösung zu meinem Quest? :gruebel: (nicht antworten, das ist rhetorisch gemeint! :mrgreen:)

supermuckl 16. Jul 2004 10:08

Re: TServerSocket Connections[x]
 
es gibt in den indy demos ein tcp client/server demo das die user verwaltung komplett beinhaltet

mit einem record :>

is zwar kein gesockse.. aber falls indy benutzen willst oder ein scheibchen davon verwenden willst isses cool

Muetze1 16. Jul 2004 16:37

Re: TServerSocket Connections[x]
 
Moin!

@Random: Der Zähler hilft dir nix mehr, wenn bei 5 Clients der 2. getrennt wird - dann stimmen die Indizies nicht mehr. Schau dir sonst wirklich mal meinen Chat an als Ideenbeispiel. Alle Quellen auf meiner HP sind ja frei verwendbar als kannst du dir da auch die Ideen her klauen...

MfG
Muetze1

Random 17. Jul 2004 02:18

Re: TServerSocket Connections[x]
 
Man wird's nicht glauben, aber es funktioniert mit dem Counter, da beim Connections[] Dings die Socketpointer/whatever bei Disconnect durch nil ersetzt werden und damit die Reihenfolge erhalten bleibt.

Nichts gegen deine Idee (welche wesentlich eleganter ist) aber diese Methode hier ist relativ simpel und funktioniert bei mir auch schon.

Muetze1 17. Jul 2004 03:14

Re: TServerSocket Connections[x]
 
Moin!

Zitat:

Zitat von Random
Man wird's nicht glauben, aber es funktioniert mit dem Counter, da beim Connections[] Dings die Socketpointer/whatever bei Disconnect durch nil ersetzt werden und damit die Reihenfolge erhalten bleibt.

Nein, das kann nicht sein. Aus dem einfachen Grund, weil man die Property ActiveConnections hat und diese immer angibt wieviele Connections[] Einträge gültig sind - und das immer von 0 bis ActiveConnections-1. Daher sollte diese Methode nicht funktionieren, da die Indizies aufrücken.

MfG
Muetze1

Random 17. Jul 2004 12:06

Re: TServerSocket Connections[x]
 
Ich benutze nicht ActiveConnections als Zähler, sondern einen LongInt, der bei Programstart auf -1 gesetzt wird, und nach jeder Connection um 1 erhöht wird. Demzufolge ist der erste Client 0, der zweite 1, etc. Trennt der erste Client die Verbindung, so ist der zweite immer noch 1.

Muetze1 17. Jul 2004 13:52

Re: TServerSocket Connections[x]
 
Moin!

Zitat:

Zitat von Random
Ich benutze nicht ActiveConnections als Zähler, sondern einen LongInt, der bei Programstart auf -1 gesetzt wird, und nach jeder Connection um 1 erhöht wird. Demzufolge ist der erste Client 0, der zweite 1, etc. Trennt der erste Client die Verbindung, so ist der zweite immer noch 1.

Ich benutze ActiveConnections auch nicht als Zähler sondern als "Anzahl der Connections" - Wert. Mit diesem kann ich das Connections Array iteriieren. Und auch dein Weg bringt kein Unterschied zu meiner Begründung: Wenn du zwei Connections hast und sich die erste trennt (Index 0), dann wird die zweite Connection automatisch zur ersten auf Index 0 - und hat nicht mehr den Index 1 im Connections[]-Array.

MfG
Muetze1

Random 17. Jul 2004 15:16

Re: TServerSocket Connections[x]
 
Solltest du recht haben, dann muss ich meinen Code mal noch intensiver testen, weil dann stimmt noch etwas anderes nicht, das dafür sorgt, das trotz "falscher Theorie" "richtige" Ergebnisse angezeigt werden. :pale:

supermuckl 17. Jul 2004 17:00

Re: TServerSocket Connections[x]
 
ich glaub eher das es ein falsches ergebnis ist und du denkst nur das der richtige client socket am werk ist ?!

Random 17. Jul 2004 20:48

Re: TServerSocket Connections[x]
 
Ich hab's überprüft. Und wie konnte es anders sein, er hatte natürlich Recht. Dank einem tollen logischen Fehler hat die Log-Datei Ergebnisse ausgespuckt die äusserst richtig aussahen. Aber leider nicht mit der Realität übereingestimmt haben :mrgreen:

Ich habe jetzt den User-Objekten ein TCustomWinSocket als Eigenschaft gegeben und bei OnConnect wird dieses auf das übergebene Socket gesetzt. Funktioniert augenscheinlich wunderbar :roll:


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