AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Connection Handling bei Client Server
Thema durchsuchen
Ansicht
Themen-Optionen

Connection Handling bei Client Server

Ein Thema von Andreas · begonnen am 10. Dez 2002 · letzter Beitrag vom 10. Dez 2002
Antwort Antwort
Andreas

Registriert seit: 10. Dez 2002
2 Beiträge
 
Delphi 6 Professional
 
#1

Connection Handling bei Client Server

  Alt 10. Dez 2002, 08:37
HI,

bin noch recht frisch in der Delphi Szene.
Suche Informationen, wie bei einer Client Server Verbindung via Indy TCPServer / TCPClient die Verbindungen gehändelt werden können.
Speziell denke ich da an einen Chat wie bei dem Indy Demo in Delphi 6.

Da steige ich leider nicht hinter, was die da alles genau machen. Liegt vieleicht daran, daß ich vieleicht noch zu frisch bin, und noch nicht alles kenne.

Würde das aber auch gerne lernen.

Also ich bekomme so eine Verbindung hin. Ist nicht das Problem.
Will ich jedoch den Client (mehrere) identifizieren, weiß ich nicht wie ich das machen soll. Es sollte also nachher gehen, das ich vom Server einen einzelnen Client eine MSG zukommen lasse, oder auch allen.
Dann will ich dem einzelnen Client auch einen Nick zuweisen.
Eben alles Chatlike.

Wie gesagt, will ich hier keine fertige Lösung, sondern wissen wie man sowas macht. Codeschnipsel sind natürlich willkommen.
Primär geht es hier um das verstehen und welche Komponenten man da einsetzt.

Vielen Dank jetzt schon für eure Hilfe.

Andreas
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#2
  Alt 10. Dez 2002, 11:56
Da musst Du ein wenig mit Klassen arbeiten. Neben Deiner Klasse (wahrscheinlich das Hauptformular), welche die Kommunikation über die TIdTCPServer Komponente handelt, musst Du eine weitere Klasse erstellen, welche das Layout für jeden einzelnen Client offenlegt. Kleines Beispiel:
Delphi-Quellcode:
type
  TClient = class
  private
    FThread: TIdPeerThread;
  public
    constructor Create(aThread: TIdPeerThread);
    procedure Execute;
  end;

constructor TClient.Create;
begin
  inherited Create;
  FThread := aThread;
end;

procedure TClient.Execute;
var
  I: Integer;
  Clients: TList;
var
  I: Integer;
  Clients: TList;
  Msg: String;
begin
  Msg := AThread.Connection.ReadLn(#$A, 50);
  if Msg <> 'then
  begin
    List := AThread.Connection.Server.Threads.LockList;
    try
      for I := 0 to Pred(List.Count) do
        if List[I] is TIdPeerThread then
          if TIdPeerThread(List[I]).Data <> nil then
            if TIdPeerThread(List[I]).Data is TClient then
              TClient(TIdPeerThread(List[I]).Data).FThread.Connection.WriteLn(
                  Msg);
    finally
      AThread.Connection.Server.Threads.UnlockList;
    end;
  end;
end;
Das wäre jetzt ein simple Broadcast durch den Client an alle weiteren angeschlossenen Clients.
Damit man sich nicht um die Clients selbst kümmern muss, kann man die Möglichkeiten von Indy recht gut ausnutzen. Wenn sich ein neuer Client mit dem Server verbindet reagiert man einfach auf das OnConnect Ereignis, erstellt eine neues Objekt von TClient und verweist das auf die Data Eigenschaft des Threads. Den Rest übernimmt Indy von allein.
Delphi-Quellcode:
procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
  AThread.Data := TClient.Create(AThread);
end;
Wenn sich der Client trennt, dann muss das Objekt wieder zerstört werden.
Delphi-Quellcode:
procedure TForm1.IdTCPServer1Disconnect(AThread: TIdPeerThread);
var
  Obj: TObject;
begin
  if AThread.Data <> nil then
    if AThread.Data is TClient then
    begin
      Obj := AThread.Data;
      AThread.Data := nil;
      Obj.Free;
    end;
end;
Jetzt musst Du nur noch darauf achten, wenn der Client eine Nachricht sendet
Delphi-Quellcode:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
begin
  if AThread.Data <> nil then
    if AThread.Data is TClient then
      TClient(AThread.Data).Execute;
end;
Achtung: Sämtlicher Code ist nicht getestet. Für Fehler keine Gewähr. Einfach nur mal zusammengetippt.
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Andreas

Registriert seit: 10. Dez 2002
2 Beiträge
 
Delphi 6 Professional
 
#3
  Alt 10. Dez 2002, 13:10
Ufff....

das ist ja fast so Derp wie das Indy Beispiel)
Das muß ich mir heute Abend mal zu gemüte führen.
Wobei ich jetzt schon weiß, das ich dabei Spass bekomme.

Na mal sehen .

Andreas
  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 18:14 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