Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi [Indy 10] Indy - Zusammenfassende Fragen (https://www.delphipraxis.net/82857-%5Bindy-10%5D-indy-zusammenfassende-fragen.html)

Dragon27 20. Dez 2006 19:19


[Indy 10] Indy - Zusammenfassende Fragen
 
:wall: :wall: Hallo,

ich möchte Euch hier um ein die Richtigstellung einiger Aussagen bitten.

1. Indy 10 ist nicht Eventgesteuert und man muss mit einem Timer den Server abfragen (steht so in einem Anderen Thread)
-verstehe ich nicht... die Indys haben doch Ereignisse.... also auch Execute oder?
-wie kann ich einen Client einzeln und gezielt ansprechen?

2. Bindings

-Wenn ich den Server online stelle muss ich diesem ein neues Binding zuweisen/machen:

Delphi-Quellcode:
var ABinding: TIdSocketHandle;
//...
server.Bindings.Clear;
ABinding := Server.Bindings.Add;
ABinding.IP := Binding;
ABinding.Port := strtoint(port);
Server.Active := True;
//..
-Warum kann ich mehrere Bindings machen? Wie sind diese Dinger zu verstehen? Bei den Sockets reicht doch auch nur ein Binding?
-Ich habe hier im Forum auch gelesen, dass die Clients über die Bindings angesprochen werden ... Bahnhof :wall:

3. Unterschied zu den Sockets

-Bei den Sockets muss ich VOR der Verarbeitung immer überprüfen ob alle Pakete/bestandteile des Befehles da sind.... Wie
ist das bei den Indys?
-Gibt es bei den Indys auch sowas wie ein Handle auf die einzelnen Clients über die man dann gezielt ansprechen kann?

Tut mir leid wenn das sehr sehr viele Fragen auf einmal sind aber ich denke sie gehören einfach alle zusammen. Da ich die 10er Indys habe finde ich auch nur sehr sehr wenig Material.

Danke für Eure Mühe und Hilfe!!!!

Gruß

Dragon27

inherited 20. Dez 2006 19:43

Re: [Indy 10] Indy - Zusammenfassende Fragen
 
Hi.
Zu 1:
Der Indy-Client ist nicht Event-gesteuert. Soll heißen: er merkt nicht wenn der Server etwas schickt.
Zu 3:
Dafür gibt es bei den Indys die Funktionen "WriteLn" und "ReadLn", dass heisst, es wird solange gelesen bis #13#10 kommt und an den String wird am Ende bei WriteLn noch ein #13#10 drangehängt ;)

Dragon27 20. Dez 2006 19:47

Re: [Indy 10] Indy - Zusammenfassende Fragen
 
Hallo,

danke für deine Antwort! Ehm was ich dann noch nich verstehe... Wie frage ich dann ab ob etwas geschickt wurde?

Also liege ich da richtig, dass ich einen Timer machen muss der immer und immer wieder ReadLn macht?
Können da nicht Daten verloren gehen?

Und wie kann ich dann einzelne Clients über den Server ansprechen ... ohne handle?

Danke!

inherited 20. Dez 2006 19:56

Re: [Indy 10] Indy - Zusammenfassende Fragen
 
Nein, da können kine Daten verloren gehen, weil es dafür einen Buffer gibt.

Dragon27 20. Dez 2006 20:53

Re: [Indy 10] Indy - Zusammenfassende Fragen
 
Danke dir für deine Hilfe!

Ich versuch jetzt schon ewig einen Chat hinzubekommen und es geht nie etwas! Entweder denke ich zu komplex oder ich weiß es auch nicht. Indy 10 Tutorials findet man nirgens und fertigen Programmcode mag ich ehrlich gesagt nicht....

Also ich habe jetzt verstanden, dass ich mit dem Client immer wieder beim Server nachfragen muss ob was da ist.... aber wie sende ich jetzt an den Client etwas bzw. wie gebe ich Daten in den Serverpuffer....

Habe nirgens ein WiriteLN beim Server gefunden und wie kann ich die Clients unterscheiden? Währe echt nett wenn mir das noch jemand sagen könnte. Und das mit den Bindings ist auch noch so ein Rätsel...

Herzlichen Dank!

inherited 20. Dez 2006 21:01

Re: [Indy 10] Indy - Zusammenfassende Fragen
 
Mach es doch in etwa so:

Aktion - Reaktion
Client loggt sich ein - Server fügt der Userliste den Client zu und sendet true oder false zurück, ob es geklappt hat (Fault wegen doppeltem Benutzername zB)
Client sendet Nachricht - Server fügt jedem Client (Klasse TClient mit Stringlist zB) Die Message hinzu für den sie bestimmt ist
Client (periodisch) fragt nach neuen Daten - Server setzt regelmäßig inkrementierte Ping-Variable zurück(Ach den User gibt es doch noch :mrgreen: ) und sendet dem Client alle Messages sowie die Userliste und leert die Client-Stringlist. Der client hängt die Messages an.

Das wars auch schon. Wenn du fragen hast, frag.

Dragon27 21. Dez 2006 10:32

Re: [Indy 10] Indy - Zusammenfassende Fragen
 
So Hallo nochmal,

also habe jetzt schon einiges herausbekommen und habe versucht beim Server etwas abzufragen. Das funktioniert auch... jedoch hängt bei dem folgenden Quelltext NACH dem empfanden des Textes das Programm:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, ExtCtrls,
  StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Timer1: TTimer;
    client: TIdTCPClient;
    ListBox1: TListBox;
    Button1: TButton;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Listbox1.items.add(client.Socket.ReadLn);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
client.Connect;
sleep(1500);
application.ProcessMessages;


end;

procedure TForm1.Button2Click(Sender: TObject);
begin
client.Socket.WriteLn('s');
application.ProcessMessages;
timer1.Enabled:=true;
application.ProcessMessages;
end;

end.
Was mache ich falsch?

Danke für die gute Hilfe!

jokerfacehro 21. Dez 2006 10:40

Re: [Indy 10] Indy - Zusammenfassende Fragen
 
Hallo !

es ist eher so gemeint:
in einem bestimmten interval sendet erstmal der client dem server dass, er noch da ist.
der client wartet dann auf daten.
in der zeit sendet der server dem client daten z.B. neuen text, die userliste und so weiter

:D :D :D

Frohe Weihnachten und viel Standfestigkeit für Silvester :mrgreen:

inherited 21. Dez 2006 13:37

Re: [Indy 10] Indy - Zusammenfassende Fragen
 
Klar dass es hängt: Wenn der Server sich "Tot-stellt" und dem Client nichts zurücksendet, wartet dieser bis in alle Ewigkeit ;)

Dragon27 21. Dez 2006 14:33

Re: [Indy 10] Indy - Zusammenfassende Fragen
 
Hallo,

mhm danke ertsmal für Eure super Hilfe! Bin schon wesentlich weiter *freu*

Ich hab aber grad echt keine Ahnung wie ich das Problem codemäßig angehen soll :-(

Sagen wir mal ich will einfach Kommandos schicken.... und diese auswerten. Nun habe
ich aber beim Server 10 Kommandos zum abschicken bereitgestellt aber ich rufe ja bei
dem Timer nur immer 1 mal das Readln auf :-(

Das nächste ist dann nich einen speziellen Client anzusprechen :-(

Wenn das alles funct bin ich echt glücklich!!

Danke Euch nochmal!!

inherited 21. Dez 2006 16:18

Re: [Indy 10] Indy - Zusammenfassende Fragen
 
Also ich würde es so machen: In einem Timer fragt der Client den Server "was neues?", der server sendet dann die anzahl der zeilen die kommen werden als integer, der client liest im timer direkt danach also erstmal mit ReadInteger diesen wert, der server schickt dann alle zeilen einzeln und der Client liest die eben empfangene anzahl an zeilen aus.

raffo 21. Dez 2006 17:04

Re: [Indy 10] Indy - Zusammenfassende Fragen
 
Ich weiss jetzt nicht, ob ich besoffen bin - oder schon besoffen bin - aber ich höre immer nur Timer in bezug auf ClientServer Compos - da ist doch das Einfachste, gar kein INDY zu verwenden, sondern den "guten alten" ClientServerSocket - oder was verstehe ich hier falsch? - denn eben dieser gibt mir ereignisgesteuerte Events, z.B.

Delphi-Quellcode:
procedure TChatForm.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var s:string;
begin
s:=Socket.ReceiveText;
ServerReceivedText.Lines.add('CLIENT: '+s);

parse(s);
end;
Soll heissen: Wass immer mir der Client sendet, das bekommt meine Anwendung automatisch (sozusagen per Interrupt) mit, also darum muss ich mich nicht kümmern - und verloren geht da auch nix.

Dragon27 23. Dez 2006 11:18

Re: [Indy 10] Indy - Zusammenfassende Fragen
 
Hallo,

ja aber bei den Sockets muss man ein ellenlanges Protokoll schreiben um mit denen einigermaßen vernünftig arbeiten zu können :-( Oder weißt du vielleicht
einen besseren Weg? ... Währe echt super!!!

Danke für die Mühe!

Gruß


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