Delphi-PRAXiS
Seite 2 von 3     12 3      

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)

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:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 Uhr.
Seite 2 von 3     12 3      

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