AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy TCP Client Server - Verständnisproblem
Thema durchsuchen
Ansicht
Themen-Optionen

Indy TCP Client Server - Verständnisproblem

Ein Thema von DelphiPeter · begonnen am 13. Sep 2009 · letzter Beitrag vom 15. Sep 2009
Antwort Antwort
DelphiPeter

Registriert seit: 21. Dez 2007
Ort: Iserlohn
198 Beiträge
 
Delphi 2010 Professional
 
#1

Indy TCP Client Server - Verständnisproblem

  Alt 13. Sep 2009, 16:27
Hallo Delphi Freunde

Ich bastel gerade an einem kleinen Chat mit Indy Komponenten.

Nun würde ich gerne eine Nachricht vom einen Client über den Server an einen anderen Client schicken. Es können aber mehrere Clients über ein und die selbe IP-Adresse angemeldet sein. Woher weiß ich jetzt, an welchen der CLients, die hinter der einen IP-Adresse steckt, die Nachricht gesendet werden soll, denn die IP ist ja immer gleich?

Hinzu kommt, das ich nicht weiß, wie ich einen Client ansprechen soll.

Klar ist, das ich mit z.B. AContext.Connection.IOHandler.WriteLn eine Nachricht an den Client schicken kann, der gerade anfragt.

Hach mensch, kann mir da mal jemand helfen?


Danke

Peter
Peter Majewski
  Mit Zitat antworten Zitat
SimStar001

Registriert seit: 18. Jan 2008
594 Beiträge
 
#2

Re: Indy TCP Client Server - Verständnisproblem

  Alt 13. Sep 2009, 17:12
wenn du die nachricht per text schickst, wovon ich mal ausgehe, kannst du vor den text ja noch ne art variable hängen, die festlegt wer die message bekommen soll... z.b. den user namen oder so...
  Mit Zitat antworten Zitat
Benutzerbild von XXcD
XXcD

Registriert seit: 19. Sep 2006
581 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Indy TCP Client Server - Verständnisproblem

  Alt 13. Sep 2009, 17:24
Such mal in der DP Suche nach Athread.Data da kannst du beispielsweise die Clientdaten hinterlegen.
  Mit Zitat antworten Zitat
g1o2k4

Registriert seit: 29. Aug 2006
57 Beiträge
 
#4

Re: Indy TCP Client Server - Verständnisproblem

  Alt 13. Sep 2009, 17:27
Zitat von DelphiPeter:
Nun würde ich gerne eine Nachricht vom einen Client über den Server an einen anderen Client schicken. Es können aber mehrere Clients über ein und die selbe IP-Adresse angemeldet sein. Woher weiß ich jetzt, an welchen der CLients, die hinter der einen IP-Adresse steckt, die Nachricht gesendet werden soll, denn die IP ist ja immer gleich?

am einfachsten wäre es jedem clienten nen eigenen port zu geben und darüber zu schicken.
aber ich glaube man kann auch beim server die clienten nach clientindex unterscheiden. zumindest ging das früher bei tsocket komponenten so, da hab ich das mal gemacht, denke indy wird auch so eine möglichkeit haben. wenn die clienten zum server connecten gibt der ihnen eine nummer um sie auseinanderhalten zu können.
  Mit Zitat antworten Zitat
Benutzerbild von XXcD
XXcD

Registriert seit: 19. Sep 2006
581 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Indy TCP Client Server - Verständnisproblem

  Alt 13. Sep 2009, 17:32
lol nen eigenen port dann müsstest du ja für jeden client nen eigen server aufsetzen
Versuch das mal so:

Delphi-Quellcode:
TClientInfo = class(TObject)
  Thread: TIdPeerThread;

  User: string; // z.B. auch den Benutzernamen mit ablegen
end;

...

uses Contnrs;
...
private
  FClients: TObjectList; // TObjectList gibt die Items automatisch frei.
end;

...

procedure TfrmMain.tcpServerConnect(AThread: TIdPeerThread);
var Client: TClientInfo;
begin
  ClientInfo := TClientInfo.Create; // erzeugen für diesen Client
  ClientInfo.Thread := AThread; // IdPeerThread zuweisen
  AThread.Data := ClientInfo; // auch in die anderen Richtung verknüpfen

  FClients.Add(ClientInfo); // und TClientInfo Instanz zur Client-Liste hinzufügen
end;

...

var Client: TClientInfo;
begin
  Client := TClientInfo(AThread.Data); // in OnConnect wurde AThread.Data auf die ClientInfo gesetzt
  AThread.Data := nil; // Verknüpfung lösen
  FClients.Remove(ClientInfo); // ClientInfo aus der Client-Liste löschen und freigeben
end;
Quelle: http://forum.delphi-treff.de/showthread.php?t=1571

Schau mal ob du damit was anfangen kannst.
Wenn nicht dann schreib ich dir da kurz was
  Mit Zitat antworten Zitat
DelphiPeter

Registriert seit: 21. Dez 2007
Ort: Iserlohn
198 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Indy TCP Client Server - Verständnisproblem

  Alt 13. Sep 2009, 17:52
Hm, mal sehen ob ich daraus was machen kann.

Ich gebe jedem Chat CLient nach dem Login eine eindeutige ID, speichere die IP, eine Email Adresse (die eindeutig ist) und dir Uhrzeit des Logins sowie einen nicknamen in einer MysQL Datenbank.

Das senden einer Nachricht von der aktuellen Verbindung an eine bestimmte ID wäre eben das was ich brauche. Aber vielleicht komme ich ja mit diesem Beispiel ein wenig weiter.
Peter Majewski
  Mit Zitat antworten Zitat
Benutzerbild von XXcD
XXcD

Registriert seit: 19. Sep 2006
581 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Indy TCP Client Server - Verständnisproblem

  Alt 13. Sep 2009, 17:58
Ich würde dir auch empfehlen beim senden der daten einen bestimmten standart festzulegen.

Beispielsweise so:
Code:
0105Das ist eine Testnachricht
Dabei wäre das dann so aufgebaut:
01 = Id des users an den die Nachricht geht
05 = Beispielsweise eine Paketid um festzulegen was passiert(Nachricht an einen Client senden).
Das ist ... = Wäre dann halt die Nachricht selbst

Dann könntest du ja eine Funktion basteln die die einzelnen Teile ausliest
  Mit Zitat antworten Zitat
DelphiPeter

Registriert seit: 21. Dez 2007
Ort: Iserlohn
198 Beiträge
 
Delphi 2010 Professional
 
#8

Re: Indy TCP Client Server - Verständnisproblem

  Alt 13. Sep 2009, 18:47
Hi

also mein Standard ist schon recht gut ausgearbeitet, wo ich hänger ist in deinem beispiel beim serverconnect. Bei Mir gibt es keine tclientinfo, das sieht bei mir so aus

procedure TfmMain.TCPServerConnect(AContext: TIdContext);
Peter Majewski
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#9

Re: Indy TCP Client Server - Verständnisproblem

  Alt 14. Sep 2009, 09:16
Hi,

im oben genannten Beispiel ist TClientInfo eine selber definierte Klasse,
die allerdings auf das arbeiten mit Indy9 abzielt(zu erkennen an TidPeerThread).
Da Du mit Indy10 arbeitest müßte bei Dir anstatt des IdPeerThread der IdContext gespeichert werden.

Im OnConnect musst Du ja auch selber eine Instanz von TClientInfo erzeugen ,
mit Werten füllen und in AContext.Data ablegen.

Greetz Data
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
DelphiPeter

Registriert seit: 21. Dez 2007
Ort: Iserlohn
198 Beiträge
 
Delphi 2010 Professional
 
#10

Re: Indy TCP Client Server - Verständnisproblem

  Alt 15. Sep 2009, 18:08
So Leute, nun habe ich es versucht mal so umzusetzen.

Meine TClientInfo Klasse sieht nun so aus
Delphi-Quellcode:
  TClientInfo = class(TObject)
    Thread: TIdContext;
    Email: string;
    GUID: string;
    Nickname: string;
    IP: string;
    LoggedIn: Boolean;
    LogonTime: string;
    Send: boolean;
    SendMode: String;
    SendTo: string;
  end;

Jetzt kommt eine Anfrage von AContext im OnExecute Ereignis. Die Nachricht soll an eine bestimmte E-Mail Adresse gehen, welche ja in TClientInfo erfasst wurde. Alle Clients die sich verbinden, werden in eine Objektliste FCLients gespeichert.

Wie sende ich nun eine Nachricht an den Client mit einer bestimmten E-Mail Adresse?

Habe es mal so versucht..
Delphi-Quellcode:
...
                found := false;
                for I := 0 to FCLients.Count - 1 do begin
                  BClient := TClientInfo(FClients.Items[I]);
                  if BClient.Email = request_param2 then begin
                    // Nachricht senden...
                    found := true;
                    BClient.Thread.Connection.IOHandler.WriteLn('RECV TEXT '+ request_param3);
                  end;
                end;
...

So richtig funktionieren tut das aber leider nicht. Die erste Nachricht wird gesendet... und dann passiert nur noch Kuddelmuddel. Der eine Client sendet was und empfängt es selber, dann bekommt ein anderer Client die Meldungen vom Server zurück. Verstehe nur noch Bahnhof.
Peter Majewski
  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 21:45 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