Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Einstieg in Server-/Clientprogrammierung (https://www.delphipraxis.net/106729-einstieg-server-clientprogrammierung.html)

everdream 15. Jan 2008 16:43


Einstieg in Server-/Clientprogrammierung
 
Hallo,

ich habe während eines Praktikums schon einmal mit Server-/Clientanwendungen zu tun gehabt, allerdings lief da alles auf C# und so ganz durchgestiegen bin ich damals wirklich nicht, zumal das nun auch schon lange her ist.

Wenn ich mich richtig erinnere, hatte ich 2 .dll Dateien und ein Beispielprogramm, mit dem man Strings verschicken konnte.
Hat jemand sowas für Delphi irgendwo rumfliegen oder weiß, wo es das online gibt?

Probleme mit Routern, IPs und, und, und,... hatte ich damals zwar, aber das krieg' ich schon geregelt.

Vielen Dank schonmal für die Hilfe! :stupid: :stupid:

halinchen 15. Jan 2008 16:45

Re: Einstieg in Server-/Clientprogrammierung
 
Die Indys sind für die Netzwerkprogrammierung ganz praktisch. Ich habe hier mal ein Tutorial geschrieben gehabt.

Klaus01 15. Jan 2008 16:48

Re: Einstieg in Server-/Clientprogrammierung
 
Guten Abend,

und hier findest Du ein kleines OpenSource Chatprogramm (ist auch client server).

Grüße
Klaus

everdream 15. Jan 2008 16:59

Re: Einstieg in Server-/Clientprogrammierung
 
Danke für die schnellen Antworten!

Habe in meinem "lib" Ordner schon 2 Ordner mit Namen "Indy9" und "Indy10", muss ich das trotzdem noch runterladen?

werde mich erstmal weiter durchlesen...


edit:
Habe auch Zahlreiche Indy-Komponenten in meinem Delphi...
TIdTCPServer + Client sind auch dabei.

halinchen 15. Jan 2008 17:04

Re: Einstieg in Server-/Clientprogrammierung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Schau doch mal ob die Komponenten da sind.

Palettenseite wären: Indy Clients, Indy Servers ,Indy Misc und Indy I/O Handlers.

edit:
Zitat:

Zitat von everdream
edit:
Habe auch Zahlreiche Indy-Komponenten in meinem Delphi...
TIdTCPServer + Client sind auch dabei.

Dann brauchst du die nicht mehr installieren.

everdream 15. Jan 2008 17:07

Re: Einstieg in Server-/Clientprogrammierung
 
Sehr schön ^_^

Dann werde ich mich nun in die Programme vertiefen. Vielen Dank nochmal!

everdream 15. Jan 2008 17:36

Re: Einstieg in Server-/Clientprogrammierung
 
Mit
Delphi-Quellcode:
... ,IdCustomTCPServer,...
unter uses kann mein Delphi nix anfangen.

Aber wenn ich ...
Delphi-Quellcode:
program Server;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True; //<-- DIESE ZEILE
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
... lösche, dann läuft das Programm aber trotzdem.

Ist das wichtig? Laufen tuts auch ohne...

halinchen 15. Jan 2008 17:39

Re: Einstieg in Server-/Clientprogrammierung
 
MainFormOnTaskbar gibt es erst seit Delphi 2007. Die Zeile kannst du einfach weglassen.

everdream 15. Jan 2008 18:00

Re: Einstieg in Server-/Clientprogrammierung
 
Okay...

Also, Verbindung aufbauen ist soweit kein Problem (zumindest, zu mir selbst :cyclops: ).
Nun fehlt mir aber so'n bischen der Ansatz, wie ich die Clients verwalten könnte.. ich weiß nichtmal, wie ich da dran komme -.-

halinchen 15. Jan 2008 18:11

Re: Einstieg in Server-/Clientprogrammierung
 
Wenn ich mich richtig errinnere hatte ich ein ähnliches Problem.

http://www.delphipraxis.net/internal...794&highlight=

Vielleicht hilft es.

Ich muss dann aber erstmal weg, bis morgen. :cheers:

DeddyH 15. Jan 2008 18:16

Re: Einstieg in Server-/Clientprogrammierung
 
Bei den Indys ist doch AFAIK eine Chat-Demo dabei, wo auch die Clients verwaltet werden :gruebel:

everdream 15. Jan 2008 18:50

Re: Einstieg in Server-/Clientprogrammierung
 
Da werd' ich gleich mal nach sehen.

So wie ich es bis jetzt verstanden hab, kann man in AThread.Data (heißt bei mir übrigens AContext.Data) einen beliebigen Typen reinschreiben und diesen mit allen Informationen füllen, die man braucht. Oder ist es aus irgendeinem Grund besser nur einen Index da rein zu schreiben udn den Rest dann irgendwo anders zu haben... mit dem Index würde man dann ja auch direkt dran kommen.

edit:
Okay, die Identifizierung wird soweit kein Problem mehr sein.
Wie sieht das jetzt mit Routern usw. aus? Damals hab' ich den Zugriff von Clients auf meinen PC als Server durch Forwarding ermöglicht. Kann man das irgendwie umgehen??

edit2:
Mal ne ganz blöde Frage wegen OOP.
Wenn ich eine eigene Klasse schreibe, die den Server und die Clients verwaltet,... wie kann, z.B. bei nem "Connect"-Ereignis, der Form-Klasse sagen, dass sie die Clientliste(Listbox) und die History(Memo) aktualisieren soll?

halinchen 16. Jan 2008 13:45

Re: Einstieg in Server-/Clientprogrammierung
 
Zitat:

Zitat von everdream
So wie ich es bis jetzt verstanden hab, kann man in AThread.Data (heißt bei mir übrigens AContext.Data) einen beliebigen Typen reinschreiben und diesen mit allen Informationen füllen, die man braucht. Oder ist es aus irgendeinem Grund besser nur einen Index da rein zu schreiben udn den Rest dann irgendwo anders zu haben... mit dem Index würde man dann ja auch direkt dran kommen.

Ich denke das ist Geschmackssache. Ich habe es, glaube ich, damals mit einer extra Liste gemacht. Aber nötig ist das IMHO nicht.

Zitat:

Zitat von everdream
edit:
Okay, die Identifizierung wird soweit kein Problem mehr sein.
Wie sieht das jetzt mit Routern usw. aus? Damals hab' ich den Zugriff von Clients auf meinen PC als Server durch Forwarding ermöglicht. Kann man das irgendwie umgehen??

Tja, das wird nicht so leicht gehen. Wenn du mal guckst, haben auch alle Onlinespiele (TrackMania United, Need for Speed: Pro Street, ...) irgendwo stehen, dass man gewisse Port "forwarden" sollte.
Einzige Möglichkeit: Nimm einen zentralen Server, alle Clients verbinden sich dorthin. Der Server ist dann quasi der Vermittler zwischen Client und Client. Fast alle Chatprogramme machen das so (ICQ, GTalk, ...).

Zitat:

Zitat von everdream
edit2:
Mal ne ganz blöde Frage wegen OOP.
Wenn ich eine eigene Klasse schreibe, die den Server und die Clients verwaltet,... wie kann, z.B. bei nem "Connect"-Ereignis, der Form-Klasse sagen, dass sie die Clientliste(Listbox) und die History(Memo) aktualisieren soll?

Kommt ganz darauf an wie man es macht.

a) Der Server sendet "Neuer Benutzer: X" an alle Clients
b) Der Server sendet "Neue Liste" und die Clients vergleichen die Liste vor und nach der Aktualisierung.
c) ...

Im Endeffekt könnte man dann eine neue Mehtode machen (z.B NewUser, etc. ) und darin vielleicht irgendwie am Ende eine andere Methode Refresh aufrufen.

So allgemein kann ich da aber nichts sagen.

sirius 16. Jan 2008 14:05

Re: Einstieg in Server-/Clientprogrammierung
 
Zitat:

Zitat von everdream
Wie sieht das jetzt mit Routern usw. aus? Damals hab' ich den Zugriff von Clients auf meinen PC als Server durch Forwarding ermöglicht. Kann man das irgendwie umgehen??

Was ist Forwarding?
Am einfachsten über NAT des Routers (serverseitig).

Edit: Wer hat mir da ein quote-Tag geklaut?
Edit2: :wall:

halinchen 16. Jan 2008 14:26

Re: Einstieg in Server-/Clientprogrammierung
 
Macht NAT nicht nur, dass die Daten, welche an die globale IP des Routers gesendet werden, an einen lokalen Rechner weitergegeben werden?

Unser Router kann auch NAT, aber die Forwarding-Einstellungen musste ich trotzdem ändern.

Außerdem blockt die integrierte Firewall meist ankommende Daten, welche von einer IP kommen an welche nichts geschickt wurde. Wenn der Server hinter einem Router sitzt, dann muss IMHO immer "forgewarded" werden. (Ich liebe Denglish :wink: ).

Aber so genau kenne ich mich da nicht aus.

everdream 16. Jan 2008 15:27

Re: Einstieg in Server-/Clientprogrammierung
 
Hm, ich bleib' wohl erstmal beim "Forward", auch wenn meine Netzwerk-/Routeronfiguration im Moment quasi auf Messers schneide steht... Wenn ich mir jetzt ne statiscge IP einstelle, weiß ich nicht, ob ich irgendwie wieder ins inet komme... sehr launisch, das Teil!

btw: Was genau ist jetzt NAT? Wenn man trotz NAT noch die "Forward"-Einstellung machen muss, dann kann mans ja auch lassen.

Joa, die Daten packe ich jetzt alle in ein Array, in AContext.Data steht dann nur ein Index.

Zitat:

Zitat von halinchen
Zitat:

Zitat von everdream
edit2:
Mal ne ganz blöde Frage wegen OOP[...]

Kommt ganz darauf an wie man es macht.

a) Der Server sendet "Neuer Benutzer: X" an alle Clients
b) Der Server sendet "Neue Liste" und die Clients vergleichen die Liste vor und nach der Aktualisierung.
c) ...
Im Endeffekt könnte man dann eine neue Mehtode machen (z.B NewUser, etc. ) und darin vielleicht irgendwie am Ende eine andere Methode Refresh aufrufen.

Nee, so meinte ich das nicht.

Hm, vllt sollte ich das Problem etwas allgemeiner schildern. Also:
Ich möchte eine von meiner Form unabhängige Klasse entwickeln, die unter anderem(?) eine Instanz von TidTCPServer enthält.
a) Ist das überhaupt sinnvoll?
wenn a) dann
b) Wie muss ich das ganze aufbauen? Die Klasse als Hauptprogramm mit einer MainForm: TChatForm; (oder so), die dann angezeigt wird?

Habe in dem Bereich leider garnix drauf. :gruebel: Weiß nichtmal, wie man vernünftig mit einem Hauptprogramm und mehreren Fenstern arbeitet,... Gibts da was gegen? :roll:

halinchen 16. Jan 2008 15:39

Re: Einstieg in Server-/Clientprogrammierung
 
Zitat:

Zitat von everdream
Ich möchte eine von meiner Form unabhängige Klasse entwickeln, die unter anderem(?) eine Instanz von TidTCPServer enthält.
a) Ist das überhaupt sinnvoll?

Ich denke schon.

Zitat:

Zitat von everdream
b) Wie muss ich das ganze aufbauen? Die Klasse als Hauptprogramm mit einer MainForm: TChatForm; (oder so), die dann angezeigt wird?

Ich würde eher der Mainform ein Feld deiner Klasse geben. (Die Mainform beinhaltet eine Instanz der Klasse.)

everdream 16. Jan 2008 16:02

Re: Einstieg in Server-/Clientprogrammierung
 
So hatte ich mir das anfangs ja auch gedacht.

Delphi-Quellcode:
[...]
type
  TMainForm = class(TForm)
    Server: TMeinChatVerwalterMitTCPServerDrin;
    BtStartServer: TButton;
    BtStopServer: TButton;
[...]
Muss ich dann eigene Ereignisse in meine Klasse einbauen? Sowas wie OnClientChange oder OnNewHistory, wo dann die Form jedes mal die Clientliste aktualisiert oder eine Zeile an das HistoryMemo anfügt....

Ich kann von der Form aus ja nicht mehr die Serverevents abfangen.

Wie mache ich eigene Events???

halinchen 16. Jan 2008 16:28

Re: Einstieg in Server-/Clientprogrammierung
 
Delphi-Quellcode:
type
  TMyEvent = procedure; //Hier Eventuell noch Parameter festlegen
//TMyEvent = procedure (MyVar1, MyVar2 : String);

  TMyClass = class
  public
    OnChangeList : TMyEvent;
   
    procedure MachWas;
  end;

...

procedure TMyClass.MachWas;
begin
  if assigned(OnChangeList) then
    OnChangeList;
end;
Sobald OnChangeList belegt ist, dann wird es in MachWas ausgeführt.

Du müsstest in der MainForm dein Event noch belegen:

Delphi-Quellcode:
InstanzVonTMyClass.OnChangeList := ProcedureZumAbarbeitenVonChangeList;
Das ganze lässt sich noch mit property, etc. verfeinern, aber so sollte es erstmal funktionieren.


Du musst deine Klasse zur Laufzeit erstellen und ein Event zuordnen. Wenn du das zur Design-Time machen willst, dann musst du das als Komponente programmieren.

Ersteres ist aber zum schnellen Testen von Änderungen optimaler, da man bei der 2. Variante die Komponente erst neu installieren müsste.

P.S. Nächstes mal: Neue Frage, neuer Thread :wink:

everdream 16. Jan 2008 16:49

Re: Einstieg in Server-/Clientprogrammierung
 
Okay, ich glaube es verstanden zu haben... ob ich recht habe, wird sich gleich zeigen.

P.S.: Okay :stupid:


edit:
Okay, vielleicht sollte ich das mit den Klassen mal ganz einfach vergessen...
Durch die Events steig' ich leider nicht durch, zumal mir wohl viele Grundlagen fehlen, um sowas zu machen.

Und ohne die Events hab' ich auch keine Ahnung, wie meine Klassen verbunden werden könnten.

Ohne Klassen wirds aber wieder so unübersichtlich und ... arghs :pale: :pale: :pale:

everdream 23. Jan 2008 13:41

Re: Einstieg in Server-/Clientprogrammierung
 
Habe hiermit erstmal auf Pause geschaltet...

Bevor ich weitermache, möchte ich das ganze besser strukturieren! (siehe anderer Thread)


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