Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy: Verbindungen eine ID zuweisen (https://www.delphipraxis.net/177392-indy-verbindungen-eine-id-zuweisen.html)

eegoar 4. Nov 2013 19:00

Indy: Verbindungen eine ID zuweisen
 
Guten Abend.

Für ein Chatprogramm (mit den Indy10 Komponenten) möchte ich Daten über einen Clienten an einen Server senden und dieser soll die Daten an den richtigen Zielclienten weitersenden.
Der Ablauf ist wie folgt:

Der Client fragt an, wie viele Clienten sich dem Server bereits angeschlossen haben (bzw. wie viele aktive Verbindungen der Server gerade hat).
Anschließend muss der Client ein Passwort senden, damit er in die Nutzerliste im Server hineinkommt und ihm eine ID zugeordnet wird (also der Client empfängt eine Nutzernummer).

Das Problem ist jetzt das folgende:
Client1 loggt sich zuerst ein und wird Verbindung 1 des Servers. Anschließend loggt sich Client2 als Verbindung 2 und Client 3 als Verbindung 3 ein.

Client1 kann Daten an Client2 senden, indem beim Server die eigehenden Daten von Client1 an die zweite Verbindung vom Server gesendet werden. Loggt jetzt jedoch Client2 plötzlich aus oder die Verbindung von Client2 zum Server bricht unvorhergesehen ab, dann sendet Client1 die Daten an den Client3, was ich auf keinen Fall möchte.

Die Sendenprozedur des Servers sieht momentan so aus:

Delphi-Quellcode:
procedure TMain.serverDatenSenden(clientNummer: integer; m : TMemoryStream);
var
  ContextList: TList;
  i: Integer;
begin
  ContextList := Main.ModulServer.Contexts.LockList;

      try
        for i := 0 to ContextList.Count - 1 do
          begin
            if clientNummer - 1 = i then
              begin
                try
                  TIdContext(ContextList[i]).Connection.IOHandler.Write(m, 0, true);
                finally
                end;
              end;
          end;
       finally
         Main.ModulServer.Contexts.UnlockList;
       end;
    end;
end;

Frage: Wie kann ich dieses Problem lösen? Ich möchte die Daten genau EINER bestimmten Verbindung zuordnen. Die Verbindung 2 vom IndyServer ist ja der 2. verbundene Client, bzw der dritte, wenn der zweite sich ausloggt.

Jumpy 5. Nov 2013 07:25

AW: Indy: Verbindungen eine ID zuweisen
 
Es gibt hier irgendwo ein ganz nettes Tutorial für ein Chat-Programm. Da war das mein ich auch so, das die Verbindungen (oder zumindesten Referenzen auf diese) zusätzlich in einer eigenen Liste verwaltet werden. Dadurch kann man den Verbindungen auch Nicknames zuordnen usw.
Ich meine in der einfachsten Version wurde einfach eine TStringlist genommen wo der String an der Stelle i eine ID oder ein Nickname ist und in dem Object an der Stelle i die Referenz auf die Verbidnung.

mjustin 5. Nov 2013 07:51

AW: Indy: Verbindungen eine ID zuweisen
 
Zitat:

Zitat von eegoar (Beitrag 1234483)

Client1 kann Daten an Client2 senden, indem beim Server die eigehenden Daten von Client1 an die zweite Verbindung vom Server gesendet werden. Loggt jetzt jedoch Client2 plötzlich aus oder die Verbindung von Client2 zum Server bricht unvorhergesehen ab, dann sendet Client1 die Daten an den Client3, was ich auf keinen Fall möchte.

...


Frage: Wie kann ich dieses Problem lösen? Ich möchte die Daten genau EINER bestimmten Verbindung zuordnen. Die Verbindung 2 vom IndyServer ist ja der 2. verbundene Client, bzw der dritte, wenn der zweite sich ausloggt.

Die Kernfrage ist doch: wie kann Client1 Client 2 identifizieren? Um eine Nachricht Client1->Client2 zu erlauben, braucht der Server die Information von Client1, dass er an "Client2" senden will.

Eine ID läßt sich einem Indy Context (einer Verbindung) zuweisen, indem man eine Unterklasse von TIdServerContext definiert, in der man dann seine eigenen Properties wie ID, Nickname, Status (z.B. 'momentan nicht am Platz') etc. unterbringt. Diese Klasse weist man dann dem Server als ContextClass zu. Beim Connect / Login kann man sie dann füllen. Wenn man dann eine Liste aller Kontexte durchlaufen und eine bestimmte ID finden will, castet man die TIdContext Objekte in den eigenen Typ und kann dann auf ID, Nickname etc. zugreifen.

himitsu 5. Nov 2013 10:48

AW: Indy: Verbindungen eine ID zuweisen
 
Du kannst auch TIdContext.Data ein eigenes Datenobjekt zuweisen.
- entweder eine eigene Klasse mit den passenden Feldern
- aber man kann natürlich auch sowas wie TSringList oder TDictionary verwenden, um darin seine Werte zu speichern.
Zitat:

Zitat von TIdContext.Data / TIdTask.Data
A user-specified object with values used during execution of the task.

Dieses Objekt wird automatisch freigegeben, wenn der TIdContext freigegeben wird.
Man braucht es ebenso einfach nur beim Connect/Login anhängen und castet sich beim Zugriff das .Data darauf um.



Ich hoffe die
Delphi-Quellcode:
for i := 0 to ContextList.Count - 1 do
-Schleife, ist nur schon als Vorbereitung für die ID-Suche gedacht.

jaenicke 5. Nov 2013 12:37

AW: Indy: Verbindungen eine ID zuweisen
 
Zu einem solchen Protokoll usw. findest du hier einiges:
http://www.entwickler-ecke.de/topic_54269.html?view=dl

Jumpy 6. Nov 2013 08:19

AW: Indy: Verbindungen eine ID zuweisen
 
Das war auch das Tutorial das ich meinte, in dem eine TStringlist zur Verwaltung der Verbindungen genutzt wurde. Kein Wunder, dass ich das gestern nicht gefunden habe, als ich das verlinken wollte, ich hab im falschen Forum geschaut.:oops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz