AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung TServerSocket und TClientSocket in Delphi 10.3.3 Community Edition (FMX)
Thema durchsuchen
Ansicht
Themen-Optionen

TServerSocket und TClientSocket in Delphi 10.3.3 Community Edition (FMX)

Offene Frage von "TurboMagic"
Ein Thema von xbkbk · begonnen am 26. Nov 2020 · letzter Beitrag vom 26. Nov 2020
Antwort Antwort
xbkbk

Registriert seit: 9. Jul 2012
Ort: 37083 Göttingen
61 Beiträge
 
Delphi 10.4 Sydney
 
#1

TServerSocket und TClientSocket in Delphi 10.3.3 Community Edition (FMX)

  Alt 26. Nov 2020, 15:01
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
Felix
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.610 Beiträge
 
Delphi 10.3 Rio
 
#2

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

  Alt 26. Nov 2020, 15:14
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.
  Mit Zitat antworten Zitat
xbkbk

Registriert seit: 9. Jul 2012
Ort: 37083 Göttingen
61 Beiträge
 
Delphi 10.4 Sydney
 
#3

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

  Alt 26. Nov 2020, 15:27
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.
Felix
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.815 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 26. Nov 2020, 17:13
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
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:29 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