AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy: Verbindungen eine ID zuweisen
Thema durchsuchen
Ansicht
Themen-Optionen

Indy: Verbindungen eine ID zuweisen

Ein Thema von eegoar · begonnen am 4. Nov 2013 · letzter Beitrag vom 6. Nov 2013
Antwort Antwort
eegoar

Registriert seit: 7. Aug 2008
6 Beiträge
 
#1

Indy: Verbindungen eine ID zuweisen

  Alt 4. Nov 2013, 20:00
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.
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.737 Beiträge
 
Delphi 6 Enterprise
 
#2

AW: Indy: Verbindungen eine ID zuweisen

  Alt 5. Nov 2013, 08:25
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.
Ralph
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#3

AW: Indy: Verbindungen eine ID zuweisen

  Alt 5. Nov 2013, 08:51

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.
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: Indy: Verbindungen eine ID zuweisen

  Alt 5. Nov 2013, 11:48
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 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 for i := 0 to ContextList.Count - 1 do -Schleife, ist nur schon als Vorbereitung für die ID-Suche gedacht.
$2B or not $2B

Geändert von himitsu ( 5. Nov 2013 um 11:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Indy: Verbindungen eine ID zuweisen

  Alt 5. Nov 2013, 13:37
Zu einem solchen Protokoll usw. findest du hier einiges:
http://www.entwickler-ecke.de/topic_54269.html?view=dl
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.737 Beiträge
 
Delphi 6 Enterprise
 
#6

AW: Indy: Verbindungen eine ID zuweisen

  Alt 6. Nov 2013, 09:19
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.
Ralph
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:18 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