Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Indy: Server an Client (https://www.delphipraxis.net/152847-indy-server-client.html)

Major1337 9. Jul 2010 09:57

Delphi-Version: 2009

Indy: Server an Client
 
Hallo!

Ich habe einen Server der auf verschiedenen Portadressen etwas an den Client sendet. Kann ich im Client mehr als ein Port freigeben und besteht die Möglichkeit für den Client herauszufinden auf welchem Port er gerade etwas erhält?

Gruß
Major1337

ChrisE 9. Jul 2010 11:25

AW: Indy: Server an Client
 
Hallo Major1337,

Bist du dir sicher mit Deiner Beschreibung?

Normal verbindet sich ein Client auf einen Server mit einer bestimmten PortAdresse.

Willst du also eine Server-Applikation, die auf mehrere Ports lauscht, dann würde ich jetzt einfach mehrere Instanzen von TIDXXXServer nutzten, wobei hier jeder auf einen anderen Port lauscht.

Der Client entscheidet dann vor dem Connect was er machen will und verbindet sich dann auf den Port.

Beispiel WebServer mit FTPServer auf einer Maschine
Port 80 -> Webseitenanfragen
Port 21 -> FTP

Oder hab ich dich jetzt falsch verstanden?

Greez, Chris

DataCool 9. Jul 2010 11:46

AW: Indy: Server an Client
 
Hi,

Zitat:

besteht die Möglichkeit für den Client herauszufinden auf welchem Port er gerade etwas erhält?
das was Du suchst ist :

Delphi-Quellcode:
IdTCPClient1.Socket.Binding.PeerPort


Allerdings kann ich mich nur meinem Vorredner anschliessen, ein Client hat immer nur genau eine Connection zu einer IP/PORT



Greetz Data

mkinzler 9. Jul 2010 11:49

AW: Indy: Server an Client
 
Genauergenommen ein Client-Port hat genau eine Verbindung mit einem Server-Port. Der Client kann natürlich mehrere Ports/Verbindungen öffnen

taveuni 9. Jul 2010 11:58

AW: Indy: Server an Client
 
Zitat:

Zitat von mkinzler (Beitrag 1034495)
Der Client kann natürlich mehrere Ports/Verbindungen öffnen

Meiner Meinung nach kann eine Client Instanz (=Socket) nur eine Verbindung öffnen (Gleichzeitig!).
Oder wie?

mkinzler 9. Jul 2010 12:01

AW: Indy: Server an Client
 
Ja aber unter Client meint man meistens das Programm.

Major1337 9. Jul 2010 12:07

AW: Indy: Server an Client
 
Danke, ich habe jetzt beim Server für jede Port eine Execute gemacht. Jetzt möchte ich mit dem Client eine Portadresse aus der Listbox auswählen - mit der er sich dann verbindet.

Delphi-Quellcode:

// Client

procedure TForm1.Button1Click(Sender: TObject);
begin


if not TCPClient.Connected then
TCPClient.Connect
else
TCPClient.IOHandler.WriteLn(Edit1.Text);

end;


procedure TForm1.ListBox1Click(Sender: TObject);
var i : Integer;

begin
  for i := 0 to ListBox1.Count - 1 do

  if ListBox1.Selected[i] then
  TCPClient.Port := StrToInt(ListBox1.Items.Strings[i]);

  end;
Delphi-Quellcode:

// Server

procedure TForm2.FormCreate(Sender: TObject);
begin

IDTCPServer1.DefaultPort := 10;
IDTCPServer1.Active := true;

IDTCPServer2.DefaultPort := 20;
IDTCPServer2.Active := true;
end;

procedure TForm2.IdTCPServer2Execute(AContext: TIdContext);
begin
Memo1.Lines.Add('Port: ' + IntToStr(IDTCPServer2.DefaultPort) + '  ' +  acontext.Connection.IOHandler.ReadLN);
end;

procedure TForm2.IdTCPServer3Execute(AContext: TIdContext);
begin
Memo1.Lines.Add('Port: ' + IntToStr(IDTCPServer3.DefaultPort) + '  ' +  acontext.Connection.IOHandler.ReadLN);
end;

usw.

Beim Server zeigt er mir aber so immer den selben Port an, jetzt weiss ich nicht wenn ich auf einem anderen Port sende, ob er tatsächlich über den Port senden und nur die falsche Portnummer anzeigt.

blackfin 9. Jul 2010 12:10

AW: Indy: Server an Client
 
So geht das natürlich nicht :)
Du brauchst, um dich an mehrere Ports zu binden, auch mehrere Instanzen des IDTCPServer.
EIN Server bindet sich immer an EINEN Port, willst du mehrere aufmachen, brauchst du mehrere Instanzen.

Was ist überhaupt dein Vorhaben, wieso brauchst du mehrere Ports?
Im Normalfall reicht eigentlich ein offener Port pro Applikation, ausser du willst, wie ChrisE bereits gesagt hatte, mehrere Server für verschiedene Protokolle aufmachen.

Entschuldige mich, wenn ich falsch liege, aber mir kommt es jetzt irgendwie so vor, als würdest du annehmen, für mehrere Clients brauchst du auch mehrere offene Ports am Server. Das stimmt so nicht, du kannst mit einem TCP-Server viele Client-Verbindungen auf einem offenen Port laufen lassen.
(Beispiel Webserver: ein Standard-Webserver läuft auf Port 80 (EIN offener Port), aber kann viele Clients bedienen, die sich immer auf Port 80 verbinden)

Major1337 9. Jul 2010 12:12

AW: Indy: Server an Client
 
hmm Ich habe doch IDTCPServer1, IDTCPServer2, IDTCPServer3... usw.

blackfin 9. Jul 2010 12:19

AW: Indy: Server an Client
 
Oh, sorry, das habe ich übersehen, aber dann stimmt dein Code irgendwie nicht, du setzte die Ports für Server 1 und 2 (3 nicht), die Execute-Routinen sind aber für 2 und 3? Jetzt bin ich etwas verwirrt.

Was willst du eigentlich genau machen?
Falls du einen Server-Port "on the fly" umschalten willst, musst du auch die Bindings des Servers umschalten, die eventuell bereits bestehen:

Delphi-Quellcode:
IdTCPServer2.DefaultPort := 20;

for I := 0 to IdTCPServer2.Bindings.Count-1 do
begin
   IdTCPServer2.Bindings[I].Port := IdTCPServer2.DefaultPort;
end;

IdTCPServer.Active := True;

Major1337 9. Jul 2010 12:27

AW: Indy: Server an Client
 
Liste der Anhänge anzeigen (Anzahl: 2)
Im Anhang sieht man mein Vorhaben. Wenn ich das jetzt richtig verstehe bin ich der Server und der Client ist in diesem Fall Sick. Ich bekomme somit vom Client auf verschiedenen Ports etwas, welche der Client verarbeiten soll.

DataCool 9. Jul 2010 12:44

AW: Indy: Server an Client
 
Hi,

das Bild sagt in meinen Augen noch nicht aus was Du machen möchtest.
Könntest Du den Sinn & Zweck mal versuchen in Worte zu fassen ?

Greetz Data

taveuni 9. Jul 2010 12:57

AW: Indy: Server an Client
 
Zitat:

Zitat von Major1337 (Beitrag 1034511)
Im Anhang sieht man mein Vorhaben. Wenn ich das jetzt richtig verstehe bin ich der Server und der Client ist in diesem Fall Sick. Ich bekomme somit vom Client auf verschiedenen Ports etwas, welche der Client verarbeiten soll.

Du möchtest also mit einem Sick RFID kommunizieren.
Dazu benötigst Du nur einen Port. Ausser wenn die unidirektionalen 50007 und 50008 für send/receive benutzt.
Die anderen unterscheiden sich in der Schnittstelle (HTTP, Socket, SSH) und teilweise im Protokoll.
Für Deine Versuche ist vermutlich 2112 mit STX/ETX am ehesten geeignet. Bist Du im Besitz des Protokolls?

Major1337 11. Jul 2010 22:18

AW: Indy: Server an Client
 
Ich bin noch nicht im Besitz des RFID. Ich möchte das ganze aber mit einem Client und Server simulieren. Ich benötige mehrere Portadressen.

Ich möchte folgendes:

Der Client schickt über Port 10 etwas an Server - der Server erkennt den Port und führt den für diesen Port bestimmten Event aus. Das gleiche sollte auch für andere Ports gelten.

taveuni 12. Jul 2010 07:48

AW: Indy: Server an Client
 
Und wo liegt Dein Problem?
Du erzeugst auf der Serverseite so viele Instanzen wie Du Ports brauchst.
Dasselbe auf der Clientseite.

DataCool 12. Jul 2010 07:57

AW: Indy: Server an Client
 
Hi Major,

jetzt bin ich auch ein wenig verwirrt.
Was hat den der Port 10 mit der obrigen Grafik zu tuen ?

Du möchtest den Server auf verschiedenen Ports laufen lassen ,
kein Problem dafür gibt es sogar mehrere Möglichkeiten :

1. Eine Anwendung, ein TIdTcpServer und über die Eigenschaft "Bindings" alle Ports hinzufügen,
auf denen der Server lauschen soll.
Das führt dazu das Du nur ein einen TIdTcpServer mit einem "OnExecute" hast,
indem Du allerdings dann die Ports der verschiedenen Clients unterscheiden musst.

2. Eine Anwwendung mehrere TIdTcpServer, für jeden Port der für die Clients offen sein soll einen Server,
dadurch gibt es auch für jeden port ein "eigenes" "OnExecute".

3. Mehrere Anwendungen bzw. eine Anwendung die mehrfach gestartet wird und je nach Configuration/Übergabe auf einem bestimmten Port läuft.
Bsp.: Der Server soll auf 3 Ports lauschen, dann wird Dein Program 3 x gestartet :
DeinServer.exe 44444 (diese Exe soll auf Port 44444 laufen)
DeinServer.exe 44445 (diese Exe soll auf Port 44445 laufen)
DeinServer.exe 44450 (diese Exe soll auf Port 44450 laufen)
In der Anwendung selber hat Du nur einen TIdTcpServer und nur ein OnExecute, den Port des Servers setzt Du beim Start der Anwendung.
Einfach wie jetzt hier im Bsp. die Eigenschaft "ParamStr" auslesen.

Ich würde Variante 3 wählen!
Übersichtlicher Code, Anzahl der Ports/Serverinstanz variabel und Du kannst im laufenden Betrieb einen Server "kicken"/neu starten
ohne das die Clients der anderen Server davon betroffen sind(das ist im Live Betrieb nachher viel Wert).

Zitat:

Der Client schickt über Port 10 etwas an Server - der Server erkennt den Port und führt den für diesen Port bestimmten Event aus. Das gleiche sollte auch für andere Ports gelten.
Weiter oben hast Du danach gefragt wie der Client den Port des Servers mit dem er gerade verbunden ist erkennt ....
Antwort:
Delphi-Quellcode:
IdTCPClient1.Socket.Binding.PeerPort
Jetzt möchtest Du wissen wie Du das dasselbe(Portunterscheidung) am Server machen kannst ?
Delphi-Quellcode:
AContext.Socket.Binding.PeerPort
Eigentlich sollte alles klar sein, sehe kein Problem bei der Umsetzung Deines Vorhabens.

Greetz Data

Major1337 12. Jul 2010 08:49

AW: Indy: Server an Client
 
Vielen Dank, werde Variante 1 und dann 3 ausprobieren.

PS:
AContext.Connection.Socket.Binding.PeerPort

;)

Major1337 12. Jul 2010 08:55

AW: Indy: Server an Client
 
hmm.. Ich bekomme aber einen Port zurück (3209) den ich gar nicht im Client deklariert habe o_O

Delphi-Quellcode:
procedure TForm2.IdTCPServer1Execute(AContext: TIdContext);
begin
Memo1.Lines.Add(acontext.Connection.Socket.ReadLn);

AContext.Connection.IOHandler.WriteLn(IntToStr(AContext.Connection.Socket.Binding.PeerPort) ' :  Erfolgreich übermittelt!');
end;
Liegt es vielleicht daran das die Ports nicht von Netzwerkadministrator freigeben wurden? Bin in einem Schulnetzwerk.

DataCool 12. Jul 2010 09:03

AW: Indy: Server an Client
 
Hi,

im Server ist PeerPort, der Port des Clients...
Vielleicht habe ich mich unglücklich ausgedrückt ...
Du brauchst dann:
Delphi-Quellcode:
AContext.Socket.Bindung.Port
Schau doch einfach mal was Du alles bei "AContext.Socket.Bindings." findest .

Greetz Data

Major1337 12. Jul 2010 09:09

AW: Indy: Server an Client
 
achso, habe Indy 10 bei mir funktioniert nur:
AContext.Binding.Port, also ohne Socket

DataCool 12. Jul 2010 09:23

AW: Indy: Server an Client
 
Hi,

sorry das war eben aus dem Kopf ....
Bei Indy10 beim Server heisst es :

Delphi-Quellcode:
AContext.Connection.Socket.Binding.Port
Greetz Data


Alle Zeitangaben in WEZ +1. Es ist jetzt 08: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