![]() |
Theorie: Client und Server in einem Programm/auf einem Rechn
Guten Morgen!
Mich beschäftigt grade eine grundlegende Frage: Dass ich einen Server und Clienten auf ein und demselben Rechner laufen lassen kann das funktioniert ja. Aber was passiert wenn zwei Server auf dem selben Port laufen? Müsste da Windows nicht meckern? Oder wird einfach der zuerst gestartete Server bevorzugt? Weitere Frage: Ist es möglich, dass ich Server und Client in ein und demselben Programm laufen lasse? Wenn ja, geht das mit den Indy-Komponenten so einfach? Für den Fall, dass es geht bräuchte ich ja für jeweils Server und Client einen eigenen Thread. Da ja der TCPServer bereits seine eigenen Threads erstellt müsste es doch gehen oder? Ok, zugegeben: Im Normalbetrieb ist das sicherlich ein Unsinn den Clienten und Server in einem Programm laufen zu lassen. Aber wenn ich den Server und Clienten debuggen möchte so müsste ich jeweils den Clienten und den Server, also jedesmal zwei Programme starten. Aber wenn es in ein und dem selben geht würde ich mir diesen Umstand ersparen. Jetzt schonmal vielen Dank für den Geist :) |
Re: Theorie: Client und Server in einem Programm/auf einem R
2 Server auf dem selben Port laufen zu lassen funktioniert nicht.
Server und Client in einer Anwendung laufen lassen funktioniert ohne Probleme... Und so unsinnig ist die Idee garnicht, ich verwende diese Methode auch manchmal :) |
Re: Theorie: Client und Server in einem Programm/auf einem R
Client/Server auf einem Rechner verwende ich sehr gern für Interprocess Kommunikation. Der rest wurde ja schon gesagt.
|
Re: Theorie: Client und Server in einem Programm/auf einem R
Bekomme ich denn irgendwie raus ob ein Dienst unter einem Port bereits läuft?
Was passiert z.B. wenn ich meinen Server zufällig unter dem Port eines bereits gestarteten Dienstes starte? Oder gleiches andersherum: Was passiert mit dem Dienst der erst nach meinem Server gestartet wird und meinen Port benutzen will? Zu zweitens: Ich probiere genau das seit Tagen aus. Oder anders gesagt, weil ich immer zu faul bin zweimal das Programm zu öffnen hab ich Server und Client gleichzeitig in meinem Programm gestartet. Allerdings, und das ist das seltsame, kann der Client zwar Daten an den Server senden, aber, der Server fängt erst mit der Auswertung an wenn der Client aus seinem Thread raus ist. Konkret (vereinfacht):
Delphi-Quellcode:
Wenn ich ein Log mitlaufen lasse das vor und nach einem Read- und WriteBuffer Statusmeldungen ausgibt wird folgendes ersichtlich:
procedure ....BtnClick (...);
var Value : Byte; begin IdTCPClient.Connect; // Verbindet brav ... Value := 1; IdTCPClient.WriteBuffer (Value, SizeOf (Value)); // Sendet brav IdTCPClient.ReadBuffer (Value); // Hängt sich in einem ReadTimeout auf ShowMessage (inttostr (Value)); ... IdTCPClient.Disconnect; end; procedure ....IdServerExecute (...); var Value : Byte; begin AThread.Connection.ReadBuffer (Value); // Liest brav if (Value = 1) then begin Value := 0; AThread.Connection.WriteBuffer (Value, SizeOf (Value)); // Sendet brav end; end;
Code:
Sobald Sitzungsnummer = 1 ist beginnt Execute zu arbeiten. Alles ok. Aber der Server antwortet nicht rechtzeitig.
17.11.2005 07:29:39:185 Sitzungsnummer: 000000: Client: Erstelle Server...
17.11.2005 07:29:39:185 Sitzungsnummer: 000000: Client: Starte Server... 17.11.2005 07:29:39:205 Sitzungsnummer: 000000: Client: Erstelle Client... 17.11.2005 07:29:39:205 Sitzungsnummer: 000000: Client: Verbinde Client... 17.11.2005 07:29:39:335 Sitzungsnummer: 000001: Client: Sende LoginCmd (1)... 17.11.2005 07:29:39:335 Sitzungsnummer: 000001: Client: Lese Server-Antwort (2) 17.11.2005 07:29:42:339 Sitzungsnummer: 000001: Client: Fehler beim Lesen! Read Timeout 17.11.2005 07:29:42:339 Sitzungsnummer: 000001: Client: Sende Client-Version (3)... 17.11.2005 07:29:42:339 Sitzungsnummer: 000001: Server: Client sendet LoginCmd (1)... 17.11.2005 07:29:42:439 Sitzungsnummer: 000001: Server: Bestätige Login (2)... 17.11.2005 07:29:42:439 Sitzungsnummer: 000001: Server: Server-Antwort Gesendet (2) 17.11.2005 07:29:42:439 Sitzungsnummer: 000001: Server: Client sendet Client-Version (3)... 17.11.2005 07:29:42:439 Sitzungsnummer: 000001: Server: Client terminated ---------------------------------------------------------------------------------------------------------------- TT.MM.JJJJ HH:MM:SS:MS Teilnehmer^ ^Nachricht Teilnehmer Sobald ich aber das Programm zweimal starte, d.h. ein Programm = Client, andere Programm = Server funktioniert es. Warum? Muss ich den Start des Clienten in einem Exrta-Thread behandeln? |
Re: Theorie: Client und Server in einem Programm/auf einem R
Zu erstens: Es wird ein Fehler angezeigt, dass dieser Port schon benutzt wird.
Zu zweitens: Logischerweise musst du den Server und Client in getrennten Threads laufen lassen. |
Re: Theorie: Client und Server in einem Programm/auf einem R
Der Server läuft doch bereits in seinem eigenem Thead. Brauch ich da trotzdem für den Client einen eigenen? Ja oder? Ich probiers gleich mal...
Zu erstens: Wo bekomme ich die Meldung? Ich meine, ich hab das ja bereits ausprobiert und eben keine bekommen. Stilles schweigen. netstat zeigt sogar beide Dienste mit selben Port an. |
Re: Theorie: Client und Server in einem Programm/auf einem R
Zitat:
Zitat:
|
Re: Theorie: Client und Server in einem Programm/auf einem R
Ok, danke dir erstmal! Werd vielleicht auch mal nach der Socket-API schauen. Vielleicht lässt sich damit was anfangen. Oder ich nutze die vorhandenen Komponenten aus Delphi.
Vielleicht weiß ja noch jemand anderes etwas darüber ob oben gefragtes mit Indy so einfach möglich ist und warum der Client die Daten die der Server schickt nicht lesen kann. |
Re: Theorie: Client und Server in einem Programm/auf einem R
:thumb: :thumb: :thumb:
Es funktioniert! Danke für den nachhackenden Hinweis! Denn: Der Server läuft ja bekanntlich bereits in einem Thread! Aber, der Client ist an das Form gebunden und läuft im Thread des Forms. Also ab, den Clienten in einen Thread gepackt und ab geht er der Peter. Es funzt tadellos! Endlich nach einer Woche Suchen und Ärgern...kann ich weiter machen :stupid: (Exception = Ausnahme? :twisted: Es ist wohl eher eine Ausnahme wenn mal keine Exception kommt muha!) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:44 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