Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   TServerSocket und TClientSocket in Delphi 10.3.3 Community Edition (FMX) (https://www.delphipraxis.net/206174-tserversocket-und-tclientsocket-delphi-10-3-3-community-edition-fmx.html)

xbkbk 26. Nov 2020 15:01

TServerSocket und TClientSocket in Delphi 10.3.3 Community Edition (FMX)
 
Guten Tag,
ich bin gerade etwas am Verzweifeln, weil ich einen kleinen Chat übers Internet programmieren möchte.
was ich bisher schon habe ist ein kleiner Datenaustausch, der bisher nur im eigenen (W)LAN funktioniert, allerdings nicht übers Internet mit der öffentlichen IP.

Code:
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes,
  System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
  FMX.Controls.Presentation, IdCustomTCPServer, IdTCPServer, IdBaseComponent,
  IdComponent, IdTCPConnection, IdTCPClient, IdContext, FMX.ScrollBox, FMX.Memo,
  FMX.Edit, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL,
  IdSSLOpenSSL;

type

  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    Button1: TButton;
    IdTCPClient1: TIdTCPClient;
    IdTCPServer1: TIdTCPServer;
    Edit1: TEdit;
    Edit2: TEdit;
    Memo1: TMemo;
    Edit3: TEdit;
    IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
    procedure Button1Click(Sender: TObject);
    procedure IdTCPServer1Connect(AContext: TIdContext);
    procedure IdTCPServer1Disconnect(AContext: TIdContext);
    procedure IdTCPServer1Execute(AContext: TIdContext);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
  IdTCPClient1.Host := Edit1.Text;
  IdTCPClient1.Port := StrToInt(Edit2.Text);
  IdTCPClient1.Connect;
  if IdTCPClient1.Connected then
  begin
    IdTCPClient1.IOHandler.WriteLn(Edit3.Text);
    IdTCPClient1.Disconnect;
  end;
end;

procedure TForm1.IdTCPServer1Connect(AContext: TIdContext);
var
ip:String;
begin
  ip:=AContext.Binding.PeerIP;
  TThread.Synchronize(nil,
    procedure
    begin
      Memo1.Lines.Add('connect: ' + ip)
    end);
end;

procedure TForm1.IdTCPServer1Disconnect(AContext: TIdContext);
var
ip:String;
begin
  ip:=AContext.Binding.PeerIP;
  TThread.Synchronize(nil,
    procedure
    begin
      Memo1.Lines.Add('disconnect: ' + ip)
    end);
end;

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
msg:String;
begin
  msg:=AContext.Connection.IOHandler.ReadLn;
  TThread.Synchronize(nil,
    procedure
    begin
      Memo1.Lines.Add('message: ' + msg)
    end);
end;

end.
Ich habe das ganze auch hier schon gepostet (https://stackoverflow.com/questions/...t-not-only-lan)
Ich habe wie mir geraten wurde Portforwarding in den Routereinstellungen aktiviert, bekomme es allerdings trotzdem nicht hin.. außerdem möchte ich nicht, dass Portforwarding extra aktiviert werden muss, da ich einen stinknormalen Chat programmieren möchte, in dem jeder User als Client und als Server agieren können soll, sodass ich vermeiden möchte, dass der Endnutzer irgendwelche Routerkonfigurationen vornehmen muss, zumal dies ja auf Android Geräten, die mit mobilen Daten unterwegs sind eh wegfällt, da Netzbetreiber sowas in der Regel nicht anbieten oder der User mit erheblichem Mehraufwand konfrontiert wird.

Grundsätzlich möchte ich ein Chatprogramm schreiben, das wie WhatsApp/Telegram oder jedes andere Chatprogramm Nachrichten, Bilder und Sprachmemos senden und empfangen kann, nur möchte ich möglichst keinen zentralen Server haben, sondern die User mithilfe von IP Adresse und Port gegenseitig connecten lassen. Im schlimmsten Fall würde ich auch einen zentralen Server betreiben, versuche dies aber vorerst zu vermeiden.

Was mir da in den Sinn kam sind die Socket Komponenten TClientSocket und TSeverSocket, die mir in der Delphi 10.3.3 Community Edition allerdings fehlen. Ich habe auch versucht, sie wie in folgendem Link nachzuinstallieren bzw. dynamisch zu nutzen, allerdings funktioniert das bei mir irgendwie nicht: https://entwickler-ecke.de/topic_TCl...a6ec78d7dadebd.

Kann mir irgendjemand helfen, einen billigen Chat (nicht über ftp) zu programmieren, der einfach erstmal nur Texte oder Dateien von A nach B und von B nach A schickt, ohne dass man dafür Routereinstelllungen ändern muss? Ich wäre auch mit einer Lösung zufrieden, in der ich einen zentralen Server betreibe, allerdings möchte ich, dass dieser Server auch auf beliebigen anderen Rechnern für ein eigenens Teilnetz laufen kann, also dass jeder Nutzer seinen eigenen Server.exe laufen lassen kann für die Leute, mit denen er chattet, weshalb ich eine Lösung ohne Portforwarding anstrebe.

Ich verwende die Delphi 10.3.3 Community Edition und möchte mit FMX auf Android und Windows Apps bzw. Programme erstellen, die miteinander chatten können.

Vielen Dank schonmal im voraus :)

Aviator 26. Nov 2020 15:14

AW: TServerSocket und TClientSocket in Delphi 10.3.3 Community Edition (FMX)
 
Wenn du keine Ports öffnen willst um eine Art P2P Netzwerk zu machen, dann brauchst du im Internet irgendwo einen Server auf dem sich die Clients anmelden und dort die Nachrichten ablegen. Die Endbenutzer können dann entweder nach neuen Nachrichten pollen oder, und das wäre die bessere Lösung, eine Art Push Benachrichtigung über einen existierenden Kanal empfangen.

Ich kann dir hier keine genauen Details nennen wie du das programmiertechnisch umsetzen solltest, aber ein einfaches Verbinden aus dem Internet in ein privates Netzwerk ist ohne Port Forwarding nicht möglich. Zudem wärst du bei IPv4 und NAT auf einen PC im Netzwerk limitiert, wenn du nicht für jeden Client einen separaten Port verwenden wollen würdest.

xbkbk 26. Nov 2020 15:27

AW: TServerSocket und TClientSocket in Delphi 10.3.3 Community Edition (FMX)
 
Okay dann würde ich doch einen zentralen Server nutzen und Port Forwarding auf meinem Router ist schon aktiviert. Ich werde das dann so umsetzen müssen, habe aber natürlich auch nicht vor, für jeden Nutzer einen eigenen Port zu öffnen^^ wie ich das umsetzen will weiß ich auch noch nicht. Wenn ich nichts vernünftiges finde mache ich das doch temporär über einen FTP Server, auf dem User die Daten abfragen können und ablegen können. Ist aber schlechter als ich es eigentlich machen wollte.

TurboMagic 26. Nov 2020 17:13

AW: TServerSocket und TClientSocket in Delphi 10.3.3 Community Edition (FMX)
 
Hallo,

wenn du's über einen Server machst, wird kein Port Forwarding im Router benötigt.
Auf dem Server sitzt einfach deine Chat Server Software. Die besitzt z.B. ein
TCP Server Socket und hört auf Port 6666.

Verbindet sich ein Client, so erzeugt der Server (Details siehe z.B. ICS Komponenten,
Open Source Netzwerkkomponenten mit eigenem Unterforum auf der EN Delphipraxis.net
Seite, vielen Demos und per GetIt installierbar, geth aber nur für Windows oder Linux,
nicht Android/iOS) erzeugt dieser für die Verbindung einen eigenen TCP SOcket auf
den diese dann über geht. Dadurch wird Port 6666 für den nächsten verbindungswilligen
wieder frei.

Durch diese TCP Verbindung hast du dann einen bidirektionalen "Kanal" zwischen
deinem Server und dem Chat Teilnehmer. Der Server ist dann halt zuständig die
Chatinhalte zwischen den entsprechenden Kanälen auszutauschen.

Clientseitig ist es ein TCP-Client und der Router weiß, welcher TN aus dem internen
Netz mit wem extern verbunden ist, da ist dann keine Portweiterleitung nötig.

Statt TCP könnte man auch UDP nehmen, das ist verbindungslos, nur ist da das Problem
mit dem Client-Port möglicherweise wieder eines weil der Server ja wissen muss, an
wen er was zurückschickt, diese Port Nummer dann vom Client auf dem PC eingestellt
wird und dann wieder ein Poirt Forwarding bräuchte.

Außerdem werden bei UDP verloren gegangene Datenpakete nicht erneut gesendet.

Grüße
TurboMagic


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz