Client- Server- Applikationen mit Standardkonfiguration

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
am2
Lazarusforum e. V.
Beiträge: 116
Registriert: Di 21. Dez 2010, 09:59
OS, Lazarus, FPC: Win (L 0.9.26 beta FPC 2.2.2)
CPU-Target: 32 Bit

Client- Server- Applikationen mit Standardkonfiguration

Beitrag von am2 »

Hi,

ich bin sicher kein Programmieranfänger und kenne mich auch so leidlich mit Lazarus aus. Aber an dieser Stelle komme ich nicht weiter.

Ich möchte mit der Standard- Konfiguration von Lazarus eine einfache Client- Server- Anwendung bauen, ohne irgendetwas nachzuinstallieren. Wie fange ich das an? (Gern auch Verweis zu einer Stelle, an der das beschrieben ist. Meine Suche stieß mich immer nur auf Beispiele, bei denen Komponenten nachinstalliert werden mussten, aber genau DAS will ich eben nicht)

Als Beispielszenario könnte folgendes herhalten:
Simples Chat- Programm.

Server: Reagiert auf An- und Abmeldungen sowie Chat- Nachrichten
Client: Hat ein paar Memos und Buttons und schickt An- bzw. Abmeldungen sowie Nachrichten an den Server und wartet darauf, dass Nachrichten vom Server zurückpurzeln.
Das muss jetzt nicht komfortabel sein, also jeder, der angemeldet ist, bekommt jede Nachricht und fertig. Alles, was danach kommt, ist kein Problem. Aber wie realisiere ich Client und Server und den damit verbundenen Nachrichtenfluss?

AM2

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Client- Server- Applikationen mit Standardkonfiguration

Beitrag von marcov »

In fpc\packages\fcl-process\examples

gibst:

ipcserver.lpi

und

ipcclient.lpi

Gut zum anfangen?

am2
Lazarusforum e. V.
Beiträge: 116
Registriert: Di 21. Dez 2010, 09:59
OS, Lazarus, FPC: Win (L 0.9.26 beta FPC 2.2.2)
CPU-Target: 32 Bit

Re: Client- Server- Applikationen mit Standardkonfiguration

Beitrag von am2 »

marcov hat geschrieben:In fpc\packages\fcl-process\examples

gibst:

ipcserver.lpi

und

ipcclient.lpi

Gut zum anfangen?



Wahrscheinlich schon, aber ich kann diese Dateien nicht finden (Ubuntu Linux, Lazarus 1.6, FPC- Version 3.0.0
Was benötige ich für eine Version? (oder wo muss ich suchen: Hier sind die Beispiele anscheinend alle unter
/usr/lib/lazarus/1.6/examples

Vielen Dank für die Mühe, klingt auf alle Fälle nach dem, was ich suche.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Client- Server- Applikationen mit Standardkonfiguration

Beitrag von af0815 »

den Ordner vom fpc suchen. Diese Beispiele sind nicht bei Lazarus sondern beim fpc vorhanden. Und da erst seit svn 32891. Bei meiner fpc 3.0.0 sind die Beispiele noch nicht, beim trunk sehr wohl drinnen. Eventuell kann man den Exampleordner aus dem trunk extrahieren.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Client- Server- Applikationen mit Standardkonfiguration

Beitrag von wp_xyz »

Nein, es gibt die Daten auch schon unter fpc 3.0, nur in einem anderen Ordner:

fpc3.0 --> (fpc-sources)/packages/fcl-base/examples
fpc3.0-fixes und fpc trunk --> (fpc-sources)/packages/fpc-process/examples

am2
Lazarusforum e. V.
Beiträge: 116
Registriert: Di 21. Dez 2010, 09:59
OS, Lazarus, FPC: Win (L 0.9.26 beta FPC 2.2.2)
CPU-Target: 32 Bit

Re: Client- Server- Applikationen mit Standardkonfiguration

Beitrag von am2 »

wp_xyz hat geschrieben:Nein, es gibt die Daten auch schon unter fpc 3.0, nur in einem anderen Ordner:

fpc3.0 --> (fpc-sources)/packages/fcl-base/examples
fpc3.0-fixes und fpc trunk --> (fpc-sources)/packages/fpc-process/examples


Bei mir nicht, oder ich suche falsch. Wahrscheinlich habe ich die Quellen nicht mit dabei. Bei mir gibt es unter /usr/lib/fpc/3.0.0 nur die Ordner
- fpmkinst
- ide
- lexyacc
- msg
- units

Unter "units" finde ich auch i386-linux/fcl-process, aber dort befinden sich nur eine Handvoll .o/.ppu/.rsj- Dateien.

Also muss ich anscheinend mal sehen, woher ich diese Beispiele besorgen kann.
Vielen Dank für Eure Hilfe. Weitere Hilfe wird gern angenommen.

creed steiger
Beiträge: 957
Registriert: Mo 11. Sep 2006, 22:56

Re: Client- Server- Applikationen mit Standardkonfiguration

Beitrag von creed steiger »

Wahrscheinlich ein Problem damit, daß die Debian/Ubuntu Fuzzies FPC und Lazarus in unendlich viele kleine Pakete zerhackt haben.

schau mal in Synaptic whatever nach ob du da noch was FPC mässig nachinstallieren kannst.

ansonsten einfach aus dem SVN ziehen (GIT gibts auch)

am2
Lazarusforum e. V.
Beiträge: 116
Registriert: Di 21. Dez 2010, 09:59
OS, Lazarus, FPC: Win (L 0.9.26 beta FPC 2.2.2)
CPU-Target: 32 Bit

Re: Client- Server- Applikationen mit Standardkonfiguration

Beitrag von am2 »

creed steiger hat geschrieben:Wahrscheinlich ein Problem damit, daß die Debian/Ubuntu Fuzzies FPC und Lazarus in unendlich viele kleine Pakete zerhackt haben.

schau mal in Synaptic whatever nach ob du da noch was FPC mässig nachinstallieren kannst.

ansonsten einfach aus dem SVN ziehen (GIT gibts auch)


Der Weg scheint steinig. Dieses neu geschaffene "App Grid" läuft nicht wirklich stabil. Mag sein, dass das daran liegt, dass ich nicht ubuntu pur, sondern mate fahre (mich nervt diese vom Mac abgekupferte Leiste, in der wirr alle verfügbaren Anwendungen Schlange stehen. Damit kam ich schon beim Mac nicht zurecht, als ich das letzte Mal - glücklicherweise vor Jahren - damit zu tun hatte. Solange man eine übersichtliche Sammlung hat, mag das ja noch angehen. Aber wenn man mehrere IDEs, noch ein paar CAD- und GIS Programme, Datenbanken, einige Klassiker (GIMP, Office etc.) drauf hat, dann wühlt man ja nur noch.)

Ich denke, ich werde morgen meinen Dienstlaptop anwerfen und unter Windows auf die Suche gehen.
Vielen Dank bis dahin. Ich melde mich an dieser Stelle wieder, wenn mich Fragen quälen.

am2
Lazarusforum e. V.
Beiträge: 116
Registriert: Di 21. Dez 2010, 09:59
OS, Lazarus, FPC: Win (L 0.9.26 beta FPC 2.2.2)
CPU-Target: 32 Bit

Re: Client- Server- Applikationen mit Standardkonfiguration

Beitrag von am2 »

Nun habe ich die Version 1.6.2 installiert und bin immer noch nicht fündige geworden :(

unter lazarus\fpc\3.0.0\source\packages\fcl-process gibt es keine examples
unter lazarus\fpc\3.0.0\source\packages\fcl-base\examples gibt es nur ipcserver und ipcclient nur als pp- Datei.
Aber ich schätze mal, das tut es auch. Ich schau mir das in jedem Fall gleich mal an.

creed steiger
Beiträge: 957
Registriert: Mo 11. Sep 2006, 22:56

Re: Client- Server- Applikationen mit Standardkonfiguration

Beitrag von creed steiger »

Als kleiner Tipp: du bist unter Linux unterwegs, bei jeder vernünftigen Desktopdistro ist locate als Standard mitinstalliert

also einfach 'man locate' eingeben (das geht mit jedem Befehl in der Console) wenn du wissen willst wie etwas funktioniert
behelfsweise auch online:
https://linux.die.net/man/1/locate

z.B. locate ipcserver

damit kannst du nach Filenamen suchen und das geht blitzschnell

am2
Lazarusforum e. V.
Beiträge: 116
Registriert: Di 21. Dez 2010, 09:59
OS, Lazarus, FPC: Win (L 0.9.26 beta FPC 2.2.2)
CPU-Target: 32 Bit

Re: Client- Server- Applikationen mit Standardkonfiguration

Beitrag von am2 »

creed steiger hat geschrieben:Als kleiner Tipp: du bist unter Linux unterwegs, bei jeder vernünftigen Desktopdistro ist locate als Standard mitinstalliert

also einfach 'man locate' eingeben (das geht mit jedem Befehl in der Console) wenn du wissen willst wie etwas funktioniert
behelfsweise auch online:
https://linux.die.net/man/1/locate

z.B. locate ipcserver

damit kannst du nach Filenamen suchen und das geht blitzschnell


getan und gefunden, nämlich unter usr/share/, sogar 2 mal
    1)
      /usr/share/doc/fp-units-fcl/3.0.0/examples/fcl-base/ipcserver.pp
      /usr/share/doc/fp-units-fcl/3.0.0/examples/fcl-base/ipcclient.pp
    2)
      /usr/share/fpcsrc/3.0.0/packages/fcl-base/examples/ipcserver.pp
      /usr/share/fpcsrc/3.0.0/packages/fcl-base/examples/ipcclient.pp



Aber auch hier keine lpi, sondern nur pp. Ich hab mal kurz hineingesehen: Ist anscheinend tatsächlich recht übersichtlich. Darauf sollte sich aufbauen lassen.

Vielen Dank allen Helfern.

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Client- Server- Applikationen mit Standardkonfiguration

Beitrag von Warf »

Dumme Frage, warum eigentlich IPC wenn man TCP Sockets Plattformunabhängig mittels ssockets Unit verwenden kann?

Ich meine IPC ist zwar schön und gut, aber wenn man Hufe hört denkt man doch an Pferde und nicht an Zebras.

am2
Lazarusforum e. V.
Beiträge: 116
Registriert: Di 21. Dez 2010, 09:59
OS, Lazarus, FPC: Win (L 0.9.26 beta FPC 2.2.2)
CPU-Target: 32 Bit

Re: Client- Server- Applikationen mit Standardkonfiguration

Beitrag von am2 »

Warf hat geschrieben:Dumme Frage, warum eigentlich IPC wenn man TCP Sockets Plattformunabhängig mittels ssockets Unit verwenden kann?

Ich meine IPC ist zwar schön und gut, aber wenn man Hufe hört denkt man doch an Pferde und nicht an Zebras.


Das ist auch schön.
Was genau muss ich tun? Hab es wie folgt probiert:

Server:

Code: Alles auswählen

TFormServer = class (TForm)
  FServer : TInetServer;
  procedure Reagiere(Sender : TObject; Data : TSocketStream)
  //...
end;
 
procedure TFormServer.Start();
begin
  FServer := TInetServer.Create('127.0.0.1',10);
  FServer.OnConnect := @Reagiere;
end;
 
procedure TFormServer.Reagiere(Sender: TObject; Data: TSocketStream);
begin
  memNachrichten.Lines.Append(Data.ReadAnsiString); // hier kommt der Code nie an
end;   


und auf der Client- Seite:

Code: Alles auswählen

procedure TFormClient.btnNachrichtSendenClick(Sender: TObject);
var socket:TInetSocket;
begin
  socket := TInetSocket.Create('127.0.0.1',10); //1
  //socket.Connect;                                        //2
  socket.WriteAnsiString('Hallo Welt');              //3
  FreeAndNil(socket);                                      //4
end;


Wenn ich den Server NICHT starte, kommt in Zeile 1 erwartungsgemäß ein Fehler.
Wenn ich den Server starte, dann kommt dort kein Fehler mehr, das Programm läuft bis "end;" durch, aber auf Serverseite wird die Nachricht anscheinend nicht verarbeitet.
Wenn ich Zeile 2 einfüge, dann kommt in eben dieser ein Fehler, auch wenn der Server läuft

Also anscheinend habe ich einen Teil des Weges zurückgelegt, aber ich verstehe noch nicht, wie ich bis zum Ziel komme. Und bezogen auf eben diese TInetServer und - Socket- Komponente finde ich nirgends Beispiele. Habe ein wenig herumexperimentiert mit KeepAlive und allem, was die Komponenten so hergaben. Aber das beste Ergebnis war, keinen Fehler zu bekommen. :(

Kann mir jemand auf die Sprünge helfen?

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Client- Server- Applikationen mit Standardkonfiguration

Beitrag von Warf »

Dir fehlt da auch einiges. Der Ablauf ist der Folgende:
Server:
1. Erstelle Socket (Mit TInetServer.Create)
2. Socket an Adresse und Port Binden (Damit das OS weiß, alle eingehenden Pakete an addresse xyz auf Port vqw soll an den Server gehen). Das geht mit Server.Bind;
3. Listening starten (Dem OS sagen das man einen Server erstellt hat) das geht mit Server.Listen;
4. Auf clients warten (Akzeptieren) (Server.StartAccepting)
Ab diesem Punkt befindet sich der Server in einer Schleife (daher sollte man dies besser in einem Separaten Thread ausführen) in der der Server darauf wartet das ein CLient connecten möchte. Ist dies der Fall dann wird das Event OnConnect gefeurt und als Parameter der neue Socket übergeben.

Ab diesem Punkt kannst du mit dem neuen Socket kommunizieren (am besten in einem Separaten Thread, da ansonsten der Server keine neuen Connections entgegen nehmen kann).

Beim Clienten geht das ganze ein wenig einfacher:

1. Erstellen des Handlers
2. Erstelle Socket (Create)
3. Connect
Und ab diesem punkt kannst du dann damit auch schreiben und lesen.

Ein kleines Beispiel (Aus dem Kopf, nicht getestet):

Code: Alles auswählen

// Server
 
type
TConnectionThread = class(TThread);
  private FSock: TSocketStream;
public
  procedure Execute; override;
  property Sock: TSocketStream read FSock write FSock;
end;
 
procedure TConnectionThread.Execute;
var Buff: array[1..1024] of AnsiChar;
  Str: String;
  len: Integer;
begin
  While Not Terminated do
  begin
    len := FSock.Read(Buff, 1024);
    if Len>0 then
    begin
      SetString(Str, @Buff[1], len);
      WriteLn(Str); // Ausgabe
    end;
  end;
end;
 
// ...
 
procedure TMyServer.Connect(Sender: TObject; Data: TSocketStream);
begin
  With TConnectionThread.Create(True) do
  begin
    Sock:=Data;
    FreeOnTerminate:=True;
    Resume;
  end;
end;
 
procedure TMyServer.ExecServer;
var
  srv: TInetServer;
begin
  srv:=TInetServer.Create(Port);
  try
    srv.MaxConnections:=-1; // Unlimited Connections
    srv.OnConnect := @Connect;
    srv.Bind;
    srv.Listen;
    srv.StartAccepting;
  finally
    srv.Free;
  end;
end;
 
//Client:
 
var cli: TInetSocket;
 
begin
  cli:= TInetSocket.Create('127.0.0.1', 11011, TSocketHandler.Create); // TSSLSocketHandler.Create for using SSL
  try
    cli.Connect;
    cli.WriteBuffer('Hallo Welt'[1], Length('Hallo Welt'))
  finally
    cli.Free;
  end;
end.   


Sieh dir einfach mal die beiden Units fpHttpClient und fpHttpServer an welche mit der FCL mitgeliefert werden, diese verwenden die ssockets und sslsockets unit

am2
Lazarusforum e. V.
Beiträge: 116
Registriert: Di 21. Dez 2010, 09:59
OS, Lazarus, FPC: Win (L 0.9.26 beta FPC 2.2.2)
CPU-Target: 32 Bit

Re: Client- Server- Applikationen mit Standardkonfiguration

Beitrag von am2 »

Das macht es viel klarer, der Sache gehe ich nach.
Vielen Dank
am2

Antworten