LNet TCP verbindungen mehrer Clients

Alle Fragen zur Netzwerkkommunikation
Antworten
Homerino
Beiträge: 1
Registriert: Do 6. Nov 2014, 11:04

LNet TCP verbindungen mehrer Clients

Beitrag von Homerino »

Hey, ich hab da mal eine Frage,
undzwar habe ich ein Netzwerk internes Chat programm gebaut.

Nun die Frage...
alles läuft eigentlich super... Der server empfängt alle nachrichten die der / DIE clients senden...
nun würde ich gerne noch einbauen das alle Clients die nachricht von einem Client sehen...
Sprich

Client 1 sendet nachricht an -> server & andere Clients

Ist das möglich? Wenn ja bitte um hilfe...
hier mein Code vom Server:

Code: Alles auswählen

 
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, lNetComponents, Forms, Controls, Graphics,
  Dialogs, StdCtrls, ExtCtrls, lNet;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    btnServerAktivieren: TButton;
    btnServerDeaktivieren: TButton;
    btnSenden: TButton;
    Button1: TButton;
    Button2: TButton;
    edNachricht: TEdit;
    Label1: TLabel;
    LabeledEdit1: TLabeledEdit;
    Memo1: TMemo;
    Server: TLTCPComponent;
    procedure btnSendenClick(Sender: TObject);
    procedure btnServerAktivierenClick(Sender: TObject);
    procedure btnServerDeaktivierenClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Memo1DblClick(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.btnServerAktivierenClick(Sender: TObject);
var
  Port : Integer;
  ServerIP : String;
  Verbindungsaufbau : boolean;
begin
    Port := StrToInt(LabeledEdit1.Text);
    Verbindungsaufbau := Server.Listen(Port);
    memo1.Append ('Server erwartet Verbindungen!');
end;
 
procedure TForm1.btnServerDeaktivierenClick(Sender: TObject);
begin
  Server.Disconnect(true);
  Memo1.append ('Server wurde deaktiviert');
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
   Memo1.Clear;
   server.IterReset;
   while server.IterNext do
         begin
           Memo1.Append(server.Iterator.localAddress);
         end;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  Memo1.Lines.Clear;
end;
 
procedure TForm1.Memo1DblClick(Sender: TObject);
var ClientIP : String;
  sendetext : String;
begin
   if edNachricht.Text = '' then
   begin
     showmessage('Bitte erst nachricht eingaben');
   end
   else
 sendetext := edNachricht.Text;
 ClientIP := Memo1.seltext;
 server.IterReset;
 while server.IterNext do
       if (ClientIP = server.Iterator.localAddress) then
       server.Sendmessage(edNachricht.Text,Server.Iterator);
end;
 
procedure TForm1.btnSendenClick(Sender: TObject);
var sendetext : String;
begin
   sendetext := edNachricht.Text;
   if (sendetext <> '') then
   begin
     Server.IterReset;
     while (Server.IterNext = True) do
           Server.SendMessage(sendetext,server.Iterator);
   end;
end;
 
procedure TForm1.ServerAccept(aSocket: TLSocket);
begin
  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('Fehlermedung:' + msg);
end;
 
procedure TForm1.ServerReceive(aSocket: TLSocket);
var Eingangstext : String;
begin
    aSocket.GetMessage(Eingangstext);
    Memo1.Append ('Eingehende Nachricht von IP ' + aSocket.localAddress + ': ' + Eingangstext);
end;
 
end.
 
 

und hier der code vom Client:

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, lNetComponents, Forms, Controls, Graphics,
  Dialogs, StdCtrls, ExtCtrls, lNet;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Client: TLTCPComponent;
    Edit2: TEdit;
    Edit3: TEdit;
    LabeledEdit1: TLabeledEdit;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure ClientConnect(aSocket: TLSocket);
    procedure ClientDisconnect(aSocket: TLSocket);
    procedure ClientError(const msg: string; aSocket: TLSocket);
    procedure ClientReceive(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(LabeledEdit1.Text);
    ServerIP := Edit2.Text;
     Verbindungsaufbau := Client.Connect(ServerIP,Port);
    if Verbindungsaufbau then
    Memo1.Append('Die Verbindung wird aufgebaut. . .');
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  client.Disconnect(true);
  Memo1.Append('Die Verbindung zum Server wurde getrennt!');
end;
 
procedure TForm1.Button3Click(Sender: TObject);
 var sendetext : String;
   begin
   sendetext := Edit3.Text;
   if (sendetext <> '') then
   begin
     Client.IterReset;
     Client.SendMessage(sendetext,client.Iterator);
   end;
end;
 
procedure TForm1.ClientConnect(aSocket: TLSocket);
begin
  Memo1.append ('Verbindung zum Server mit der IP: ' + aSocket.LocalAddress +' wurde hergestellt');
end;
 
procedure TForm1.ClientDisconnect(aSocket: TLSocket);
begin
  memo1.append ('Verbindung zum Server wurde getrennt');
end;
 
procedure TForm1.ClientError(const msg: string; aSocket: TLSocket);
begin
  Memo1.Append('Fehlermeldung: ' + msg);
end;
 
procedure TForm1.ClientReceive(aSocket: TLSocket);
var Eingangstext : String;
begin
 aSocket.GetMessage(Eingangstext);
 Memo1.Append ('Eingehende Nachricht von IP ' + aSocket.localAddress + ': ' + Eingangstext);
end;
 
end.
 


Lg Homer

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: LNet TCP verbindungen mehrer Clients

Beitrag von corpsman »

Wenn ich das Richtig sehe, hast du ja alles was du bauchst schon.

Wenn du nun vor Jede Nachricht die Versendet wird einfach ein Byte einfügst, welches der Server wieder abschneidet, kannst du damit steuerkommandos senden.
Diese kannst du auswerten und damit den Server dazu veranlassen die eben empfangene Nachricht an alle bekannten Clients zu senden.
--
Just try it

Antworten