![]() |
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:
Ich habe das ganze auch hier schon gepostet (
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 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: ![]() 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 :) |
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. |
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.
|
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 08:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz