LNet Tutorial

Alle Fragen zur Netzwerkkommunikation
mintpc
Beiträge: 124
Registriert: Mo 6. Sep 2010, 18:39
OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
CPU-Target: Win 7
Wohnort: Mailand

LNet Tutorial

Beitrag von mintpc »

Hallo zusammen,

da die Frage hier sehr oft vorkommt, hab ich mal ein kleines Einsteiger-Tutorial zu
der LNet-TCP-Komponente geschrieben.

Zielgruppe: Anfänger! (Ist allerdings von 2012, also schon etwas älter.)

Ich hoffe, es hilft hier und da.
Beste Grüße
mintpc
Zuletzt geändert von mintpc am So 21. Mär 2021, 09:49, insgesamt 1-mal geändert.

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: LNet Tutorial

Beitrag von carli »

Seltsam.
Von weitem sieht LNet so aus, als könne der TCP-Server immer nur eine Verbindung gleichzeitig offen haben :o

mintpc
Beiträge: 124
Registriert: Mo 6. Sep 2010, 18:39
OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
CPU-Target: Win 7
Wohnort: Mailand

Re: LNet Tutorial

Beitrag von mintpc »

Richtig. War eigentlich auch nur als rudimentäres Einsteigerbeispiel
für einen Server und einen Client gedacht.

Trotzdem danke für Anmerkung. Ich hab das Tutorial grad noch so erweitert,
dass in einem weiteren Schritt nun auch an mehrere angeschlossene Clients
gesendet werden kann.

Und :oops: ich hab dabei noch einen kleinen Fehler entdeckt.
Ist nun aber korrigiert. :!:

mintpc

felix96
Beiträge: 287
Registriert: So 29. Nov 2009, 17:44
CPU-Target: 32BitWin+64bitUbunt

Re: LNet Tutorial

Beitrag von felix96 »

Kannst du vielleicht noch ein Beispielprojekt dranhängen?
Danke schonmal für eure Antworten
it´s not a bug, it´s a feature!

mintpc
Beiträge: 124
Registriert: Mo 6. Sep 2010, 18:39
OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
CPU-Target: Win 7
Wohnort: Mailand

Re: LNet Tutorial

Beitrag von mintpc »

Ich wollte das Tutorial noch etwas ergänzen, in den nächsten Tagen mit ein
bisschen Zeit. Wenn ich das zusammen habe, leg ich auch die Programmbeispiele
dazu.

Live
Beiträge: 144
Registriert: So 22. Aug 2010, 16:06
OS, Lazarus, FPC: Backtrack 5 RC4 - 64bit Gnome
CPU-Target: 64bit
Wohnort: NRW
Kontaktdaten:

Re: LNet Tutorial

Beitrag von Live »

Schöne Homepage mit schönen Tutorials, danke dafür.

Sieht gut aus, weiter so. Code-Examples wären, wie oben erwähnt, natürlich noch schön :)

Grüße

felix96
Beiträge: 287
Registriert: So 29. Nov 2009, 17:44
CPU-Target: 32BitWin+64bitUbunt

Re: LNet Tutorial

Beitrag von felix96 »

In der ersten Abfrage eidit1.text<>'' ist ein Leerzeichen zwischen den Anführungsstrichen.
Ist das ein Fehler?
Danke schonmal für eure Antworten
it´s not a bug, it´s a feature!

starkard
Beiträge: 87
Registriert: Mi 31. Okt 2007, 10:44

Re: LNet Tutorial

Beitrag von starkard »

Hallo und danke für das aufschlussreiche Tutorial,

Ich arbeite seit kurzem auch gerade mit LNet und habe leider noch eine kleine ungklärte Frage.
Falls der Server gezielt nur "einen" Clienten ansprechen möchte, dessen IP bekannt sei, müsste man das doch in ähnlicher Form tuen:

Code: Alles auswählen

if (sendetext <> '') then
begin
  Server.IterReset;
  while (Server.IterNext) do
    if server.Iterator.Peeraddress='ClientIp' then
      Server.SendMessage(sendetext,server.Iterator);
end;


Oder gibt es eine geschiktere Variante?

mintpc
Beiträge: 124
Registriert: Mo 6. Sep 2010, 18:39
OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
CPU-Target: Win 7
Wohnort: Mailand

Re: LNet Tutorial

Beitrag von mintpc »

Eine bessere Variante kenn ich auch nicht. Höchstens die Verwaltung
der Clients über die Durchnummerierung der Sockets (siehe mein Beispiel
im Tutorial). Ist aber letztlich dasselbe.

Ansonsten hab ich die Programmbeispiele jetzt auch auf der Seite zum
downloaden. Falls noch Fehler oder so auffallen, bitte melden!

http://www.martinjakobs.de/pages/lazarus.php

mintp

leosok
Beiträge: 24
Registriert: Mi 10. Nov 2010, 01:12

Re: LNet Tutorial

Beitrag von leosok »

Vielen Dank für deine Demo! Ich schreibe gerade an einem Programm mit Netzwerkkommunikation und deine Beispiele werden mir viele Stunden arbeit ersparen! Ich muss dann nur noch ein Protokoll entwickeln über das die Daten hin und her übertragen werden.

Viele Grüße

leosok

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: LNet Tutorial

Beitrag von carli »

Für Spiele gibts dann noch die ENET-Bibliothek, für die ich einen Header inzwischen portiert hab. (der allerdings noch unfertig ist [enthält nur funktionen, die ich brauche])
Bei Interesse release ich den. in #fpc scheint man bis jetzt noch nicht auf die Anfrage reagiert zu haben, die Unit in den FPC mit aufzunehmen.

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: LNet Tutorial

Beitrag von MAC »

Ich hab jetzt jede menge mit lnet gerabeitet und hab aber ein komischen fehler.
Zum aufbau:
Ich hab 1 Programm - das enthält 1 Server - 1 Client und 64 Clienten.
Beim Klicken auf Sever suchen.
Nutzt es die 64 Clienten. gibt jeden ne nummer (192.168.0.1 , .2 , .3 , .4 ...)
und coneccted.
Wenn jetzt das OnConnected ereignis ausgelöst wird wird in ne listbox geschrieben aSocket.PeerAddress;
Danach kann man nen haupt clienten mit der adresse conecten lassen.

so, an einem pc klappt das immer wunderbar - aber wenn ich 2 PC nutze (win7 64 bit und win xp 32 bit (SP3) - Programm jeweils in 32 bit compiliert) . Beide Firewalls aus.
winXP = Server - Win7 client : funktioniert.
Win7 = Server - XP = client : funktioniert nicht.

Allerdigs kommen am Server noch informationen an.
Verbindung zum Clienten mit Ip. ... hergestellt. // OnAccept
Error: Get Error [10054] Eine Vorhandene Verbindung wurde vom Remotehost geschlossen // OnError
//OnDisconecct

Das OnConecct ereignis am Client wird aber nicht ausgelößt...

Kennt sich einer damit aus ?
Danke

Code: Alles auswählen

Signatur := nil;

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: LNet Tutorial

Beitrag von Maik81ftl »

Habe mir dies auch mal angeschaut, bin allerdings durch die verwenung Meines BS an eine Grenze gelandet

Code: Alles auswählen

unit WinSocket
. hab dies mal alles auskommentiert erhalte dabei allerdings Keine werte für das Beispiel Clinet III
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: LNet Tutorial

Beitrag von Maik81ftl »

Bin durch ein Zufall wieder über ein offenes Projekt gestolpert. Habe durch die gelisteten Beispiele auf Client-Server-Kommunikation-mit-LNET-und-Lazarus folgendes Testprogramm zusammengestellt.

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  lNetComponents, lNet;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Memo1: TMemo;
    Server: TLTCPComponent;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure ServerAccept(aSocket: TLSocket);
    procedure ServerDisconnect(aSocket: TLSocket);
    procedure ServerError(const msg: string; aSocket: TLSocket);
    procedure ServerReceive(aSocket: TLSocket);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var Port: Integer;
    ServerIP: String;
    Verbindungsaufbau: Boolean;
begin
  Port := StrToInt(Edit1.Text);
  Verbindungsaufbau := Server.Listen(Port);
  if verbindungsaufbau then Caption:= 'Hier bin ich' else Caption:='Bin auf Suche';
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  Server.Disconnect(True);
  Memo1.Append('Server wurde Deaktiviert');
end;
 
procedure TForm1.Button3Click(Sender: TObject);
var sendetext : String;
begin
  sendetext := Edit1.text;
  if (sendetext <> ' ') then
     Server.SendMessage(sendetext);
end;
 
procedure TForm1.ServerAccept(aSocket: TLSocket);
begin
  Label1.Caption:= aSocket.LocalAddress;
  Memo1.Append('Verbindung Zum Client mit der IP: ' + aSocket.LocalAddress + ' wurde hergestellt');
end;
 
procedure TForm1.ServerDisconnect(aSocket: TLSocket);
begin
  Memo1.Append('Verbindung zum Client wurde getrennt.');
end;
 
procedure TForm1.ServerError(const msg: string; aSocket: TLSocket);
begin
  Memo1.Append('Fehlermeldung: ' + msg);
end;
 
procedure TForm1.ServerReceive(aSocket: TLSocket);
var Eingangstext: String;
begin
  aSocket.GetMessage(Eingangstext);
  Memo1.Append('Eingehende Nachricht: ' + Eingangstext);
end;
 
end.


Die Zeile

Code: Alles auswählen

Label1.Caption:= aSocket.LocalAddress;
habe ich zu sichtzwecke eingefügt. Jesoch scheint die entsprechende Funtion NIE aufgerufen zu werden.

Der Formhalber setzte ich euch hier noch den Code der lfm-file rein.

Code: Alles auswählen

object Form1: TForm1
  Left = 445
  Height = 275
  Top = 225
  Width = 354
  Caption = 'Form1'
  ClientHeight = 275
  ClientWidth = 354
  LCLVersion = '0.9.31'
  object Label1: TLabel
    Left = 10
    Height = 18
    Top = 10
    Width = 27
    Caption = 'Port'
    ParentColor = False
  end
  object Edit1: TEdit
    Left = 10
    Height = 27
    Top = 32
    Width = 80
    TabOrder = 0
    Text = '5000'
  end
  object Button1: TButton
    Left = 10
    Height = 29
    Top = 64
    Width = 124
    AutoSize = True
    Caption = 'Server &aktivieren'
    OnClick = Button1Click
    TabOrder = 1
  end
  object Button2: TButton
    Left = 200
    Height = 29
    Top = 64
    Width = 140
    AutoSize = True
    Caption = 'Server &deaktivieren'
    OnClick = Button2Click
    TabOrder = 2
  end
  object Memo1: TMemo
    Left = 10
    Height = 120
    Top = 104
    Width = 334
    ScrollBars = ssAutoBoth
    TabOrder = 3
  end
  object Edit2: TEdit
    Left = 13
    Height = 27
    Top = 240
    Width = 179
    TabOrder = 4
    Text = 'Edit2'
  end
  object Button3: TButton
    Left = 248
    Height = 29
    Top = 238
    Width = 59
    AutoSize = True
    Caption = '&senden'
    OnClick = Button3Click
    TabOrder = 5
  end
  object Server: TLTCPComponent
    Port = 0
    OnReceive = ServerReceive
    OnError = ServerError
    OnDisconnect = ServerDisconnect
    OnAccept = ServerAccept
    Timeout = 0
    ReuseAddress = True
    left = 288
    top = 112
  end
end


Wenn jemand ggf den Fehler sieht danke ich schon mal vorab mit dem Wink mit einem Bello :mrgreen: :mrgreen: :mrgreen:

zum Schluß! Only Unix in use...
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: LNet Tutorial

Beitrag von MAC »

Das sieht ziemlich richtig aus.
Das die Prozedure nicht aufgerufen wird scheint wohl daran zu liegen, das es zwar ein Server gibt, allerdings kein Client der darauf zugreift.
Oder gibt es auch noch eine Client-Komponente auf dem Formular (Server und Client ist technisch das gleiche, schmeis einfach noch ne 2te Komponente drauf die du dann mit den Server verbinden lässt...

Code: Alles auswählen

Signatur := nil;

Antworten