Einzelnen Beitrag anzeigen

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