![]() |
ClientSocket bekommt keine Verbindung
Habe ein für mich unverständliches Problem. Siehe Code-Snippet
Delphi-Quellcode:
Ich will für ein Miniprogramm (eigentlich ohne Fenster) die guten alten TClientSocket und TServerSocket verwenden.
procedure TMainForm.Button1Click(Sender: TObject);
begin ServerSocket1.Port := 8078; ServerSocket1.Open; if (ServerSocket1.Port = 8078) and (ServerSocket1.Active) then //Server aktiv ?? begin ClientSocket1.Port := 8078; ClientSocket1.Address := '127.0.0.1'; ClientSocket1.Open; if ClientSocket1.Active then // <------------------- hier tut sich nichts n := ClientSocket1.Socket.SendText(AnsiString('Test')); ClientSocket1.Close; end; end; Bekomme aber keine Verbindung. Nun hab ich mal alles auf o.g. Schnipsel reduziert. Der Server wird geöffnet, der Port zugewiesen. Das Öffnen des Clients klappt nicht, das ClientSocket1.Active bleibt immer false. Woran kann das liegen, was muss ich evtl. tun ? Grüsse, Uli |
AW: ClientSocket bekommt keine Verbindung
Also ich würde Server und Client getrennt voneinander entwickeln.
Dabei sollte zuerst der Server funktionieren bevor man sich an den Client macht. Windows hat standardmässig das Programm telnet.exe an Bord mit dem man den Server testen kann. (manchmal muss man den Telnet-Client ![]() Erst wenn dieser Test erfolgreich ist, lohnt es sich mit dem Client zu beginnen. Der Aufruf in der Eingabeaufforderung lautet:
Code:
Entweder kommt eine Verbindung zustande oder nicht.
C:\> telnet localhost 8078
Falls nicht gibt es ein Problem im Server. |
AW: ClientSocket bekommt keine Verbindung
Ja, ich hatte zuerst auch den Server unabhängig vom Client geschrieben.
Und wenn ich beim Sever mit
Delphi-Quellcode:
teste, bekomme ich auch eine Verbindung inkl. Anzeige des gesendeten Textes im Server. Das klappt also.
telnet localhost 8078
Meine eigentliche Anwendung (testweise arg geschrumpft) ist
Delphi-Quellcode:
program ACSendCommand;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, System.Win.ScktComp; var Client: TClientSocket; begin Client := TClientSocket.Create(nil); Client.Host := 'localhost'; Client.Port := 8078; Client.Open; if Client.Active then // <-----------------------wird nicht aktiv Client.Socket.SendText(AnsiString('Test')); Client.Close; Client.Free; end. Ich hab da nun ebenfalls als Hostadresse localhost vorgegeben. Es klappt genausowenig wie mit 127.0.0.1 oder der richtigen IP. Also scheint da was falsch zu sein im Gegensatz zu Telnet. Auch ein Senden ohne Abfrage auf den aktiven Client bringt nichts. Beim Server wird dieselbe ScktComp verwendet. Delphi ist XE2. |
AW: ClientSocket bekommt keine Verbindung
Unit ScktComp.pas in Projektverzeichnis kopieren und ins Projekt aufnehmen.
(Ggf. muss uses System.Win.ScktComp -> uses ScktComp geändert werden) Danach kann man auf
Delphi-Quellcode:
einen Breakpoint setzen und per Einzelschritt nachforschen woran es klemmt.
if Client.Active then
Ausserdem sollte man testen, ob das Problem vielleicht nur bei einer Konsolenanwendung besteht. Sockets melden Ereignisse über Windows Messages; da es bei Konsolenanwendungen keine Messageloop gibt wäre es denkbar, dass dies ein Problem darstellt. |
AW: ClientSocket bekommt keine Verbindung
Probiers mal so:
Delphi-Quellcode:
Ich glaube, die Komponente ist standardmäßig non-blocking - dh. beim Verbindungsaufbau wird das Programm fortgesetzt. Da liefert dir Active false, da evt. noch nicht erfolgreich verbunden wurde.
Client.Open;
Sleep(1000); // 1 sek Application.ProcessMessages; if Client.Active then // <-----------------------wird nicht aktiv Das dauert im Schnitt einige Sekunden... |
AW: ClientSocket bekommt keine Verbindung
Zitat:
Indy und Synapse TCP Clients funktionieren problemlos in Konsole Anwendungen, nur die alten TClient/TServerSockets (asynchron) und andere asynchrone Komponenten wie ICS benötigen die Windows Message Loop, um Gegensatz zu Indy und Synapse (die dadurch auch leichter auf anderen Betriebssystemen einsetzbar sind). Oft wird aber hier in diesem Zusammenhang 'Sockets' gesagt, aber damit ist dann nicht die allgmein bekannten TCP/IP Sockets, sondern speziell die alten Delphi TClientSocket / TServerSocket Komponenten gemeint. |
AW: ClientSocket bekommt keine Verbindung
Zitat:
![]() Und Konsolenanwendungen können ein unsichtbares Window + einen Thread erzeugen um die Messages zu empfangen und abzuarbeiten. Wie das in telnet.exe läuft, weiss ich nicht aber es ein Aspekt der bei asynchronen Sockets beachtet werden sollte. |
AW: ClientSocket bekommt keine Verbindung
Genau das hier trifft zu:
Zitat:
|
AW: ClientSocket bekommt keine Verbindung [gelöst]
Zitat:
In der Zwischenzeit hab ich es mit Indy getestet und das klappt. Never touch a running system ...
Delphi-Quellcode:
IdTCPClient1 := TIdTCPClient.Create(nil);
try IdTCPClient1.Host := '127.0.0.1'; IdTCPClient1.Port := 8078; IdTCPClient1.Connect; if IdTCPClient1.Connected then begin IdTCPClient1.IOHandler.Write(s); IdTCPClient1.Disconnect; end; except on E: Exception do ; end; IdTCPClient1.Free; |
AW: ClientSocket bekommt keine Verbindung [gelöst]
Zitat:
Sicherheitshalber würde ich das Free in einem finally Block platzieren.
Delphi-Quellcode:
IdTCPClient1 := TIdTCPClient.Create(nil);
try IdTCPClient1.Host := '127.0.0.1'; IdTCPClient1.Port := 8078; try IdTCPClient1.Connect; IdTCPClient1.IOHandler.Write(s); IdTCPClient1.Disconnect; except on E: Exception do begin Log(E); raise; end; end; finally IdTCPClient1.Free; end; |
AW: ClientSocket bekommt keine Verbindung
Ich hab nun
Delphi-Quellcode:
getestet und damit klappt es auch. Das was der ursächliche Grund.
Client.ClientType := ctBlocking
Da sich mit TClientSocket ein kleineres Programm ergibt als mit TIdTCPClient verwende ich nun doch wieder das TClientSocket. Das Programm sieht nun so aus:
Delphi-Quellcode:
Client := TClientSocket.Create(nil);
try Client.Host := '127.0.0.1'; Client.Port := 8078; Client.ClientType := ctBlocking; try Client.Open; Client.Socket.SendText(AnsiString(s)); Client.Close; except on E: Exception do; //ignore, do nothing end; finally Client.Free; end; |
AW: ClientSocket bekommt keine Verbindung
Ähm, warum nutzt du nicht einfach das Event
![]() Depending on the service, this may be the point when the socket should start reading or writing over the connection. |
AW: ClientSocket bekommt keine Verbindung
Eine
![]() Es kann sein, dass es diese Problem bei Indy nicht gibt, da Indy das selbst auch intern macht - kenn mich mit Indies ned so aus. |
AW: ClientSocket bekommt keine Verbindung
Zitat:
Es scheint mir als ob man nur durch Trial & Error lernt. Die Beschreibung einer Komponente mit den jeweiligen Methoden und Eigenschaften besagt ja nicht direkt etwas darüber, WIE man das nun richtig einsetzt. Und dann studiert man ja auch nicht jede Methode bis ins Letzte. Also schaut man nach Beispielen. Und bei den Beispielen hier im Forum, oder ![]()
Delphi-Quellcode:
in keinem der Beispiele vorkam. Oder, dass man die Abfrage auf aktiv nicht braucht, weil Exception. Das OnConnect ist auch nicht aufgetaucht, bis eben auf Deinen Hinweis.
ctBlocking
|
AW: ClientSocket bekommt keine Verbindung
Zitat:
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:46 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