Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TClient & TServer socket verbindung (https://www.delphipraxis.net/79341-tclient-tserver-socket-verbindung.html)

TobiasT 20. Okt 2006 14:17


TClient & TServer socket verbindung
 
Hi@all,

Komponenten:
TClient &
TServer Socket

Problemfall:
Ein Online-Spiel das die Verbindung zum Server aufbauen soll, wenn das Programm gestartet wird.
Wenn aber der Server nicht zu errichen ist, dann gibt er einen Asynchron Fehler aus und der Client versucht nicht mehr zu verbinden.

Frage:

ist es möglich den Clienten so lange verbinden zu lassen, bis das Programm geschlossen wird oder die Verbindung zum Server steht?



Mfg Tobias

inherited 20. Okt 2006 14:22

Re: TClient & TServer socket verbindung
 
Delphi-Quellcode:
repeat
  try
    tcpclient1.Connect;
  except
    inc(TriesToConnect);
  end;
until tcpclient1.Connected;
Bedenke aber, dass das nicht unbedingt die beste lösung ist, so wie du das machen willst!

freak4fun 20. Okt 2006 14:29

Re: TClient & TServer socket verbindung
 
Zitat:

Zitat von inherited
Delphi-Quellcode:
repeat
  try
    tcpclient1.Connect;
  except
    inc(TriesToConnect);
  end;
until tcpclient1.Connected;
Bedenke aber, dass das nicht unbedingt die beste lösung ist, so wie du das machen willst!

Öhm... dann hängt sich das Programm auf. Außer, da kommt ein Application.ProcessMessages; rein, das Connect kommt in einen Timer / Thread. Vielleicht sollte man auch noch andere Abbruchbedingungen einbauen. ;) Von der Grundidee aber richtig.

MfG
Freak

inherited 20. Okt 2006 14:34

Re: TClient & TServer socket verbindung
 
ARG, sehe jetzt erst, dass er sich auch mittendrin beenden sollen kann, sorry. Natürlich, Threads+Abbruchbedingung :wall:

TobiasT 20. Okt 2006 14:47

Re: TClient & TServer socket verbindung
 
Er gibt mir Leider immernoch einen Asynchron Fehler aus...

So sieht mein code zum connecten aus:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
Client.Address:='127.0.0.1';
Client.Port:=4100;
repeat
  Application.ProcessMessages;
  try
    client.Active:=true;
  except
    inc(TriesToConnect);
  end;
until client.Socket.Connected=true;
end;
Was mache ich falsch?

freak4fun 20. Okt 2006 14:49

Re: TClient & TServer socket verbindung
 
Hast du das programm mal über die *.exe gestartet und nicht über F9?

ste_ett 20. Okt 2006 14:51

Re: TClient & TServer socket verbindung
 
Prüfe mal, ob auf dem Port überhaupt was läuft, bei einem Connect auf localhost ist ein Fehler in der Verbindung eher unwahrscheinlich.

Sowas
Delphi-Quellcode:
until client.Socket.Connected=true;
macht man nicht. :)

Besser:
Delphi-Quellcode:
until ((client.Socket.Connected) or (TriesToConnect >= MAX_TRIES));

TobiasT 20. Okt 2006 14:59

Re: TClient & TServer socket verbindung
 
Hab das Programm über die exe gestartet und den code von ste_ett eingebaut.

Wenn der Server läuft, geht alles Wunderbar!

Wenn der Server ausgeschaltet ist, hängt sich das Programm auf, es kommt keine Form und nach einiger Zeit eine Asynchron Fehler meldung...

ste_ett 20. Okt 2006 15:03

Re: TClient & TServer socket verbindung
 
Zitat:

Zitat von TobiasT
Hab das Programm über die exe gestartet und den code von ste_ett eingebaut.

Wenn der Server läuft, geht alles Wunderbar!

Wenn der Server ausgeschaltet ist, hängt sich das Programm auf, es kommt keine Form und nach einiger Zeit eine Asynchron Fehler meldung...

Logisch. :)
Wenn keine Anwendung antwortet, wird ewig versucht, eine Verbindung aufzunehmen und das Programm bleibt in der Schleife hängen.
Wenn du das z.B. im FormCreate machst, siehst du keine Form, da das Programm diese noch nicht erstellt hat.

Wie hoch hast du MAX_TRIES gesetzt?

Du solltest auch in den Schleifendurchlauf ein "Sleep();" und ein "Application.ProcessMessages" einbauen.

freak4fun 20. Okt 2006 15:08

Re: TClient & TServer socket verbindung
 
Warum Sleep?

TobiasT 20. Okt 2006 15:09

Re: TClient & TServer socket verbindung
 
Habe max_tries auf 10 gesetzt!

Habe jetzt alles in einen Timer gesetzt, der jede 5 sek. versucht die Verbindung herzustellen.

Jetzt müssten ich nur noch die blöde Asynchron Fehlermeldung unterdrücken können, dann wäre das Problem gelöst.

Delphi-Quellcode:
procedure TForm1.TimerTimer(Sender: TObject);
begin
  IF Client.Socket.Connected=false THEN
  begin
    try
      client.Active:=true;
    except
      inc(TriesToConnect);
    end;
  end;
end;

ste_ett 20. Okt 2006 15:13

Re: TClient & TServer socket verbindung
 
Zitat:

Zitat von TobiasT
Jetzt müssten ich nur noch die blöde Asynchron Fehlermeldung unterdrücken können, dann wäre das Problem gelöst.


Gaaaaaanz schlechte Idee. :D
Fehler beseitigen, nicht unterdrücken! :)

Welchen Fehler-Code bekommst du genau?

TobiasT 20. Okt 2006 15:15

Re: TClient & TServer socket verbindung
 
Asynchroner Socket-Fehler 10061.

//edit:

Kann man das vielleicht mit dem onError Ereignis abfangen?

ste_ett 20. Okt 2006 15:19

Re: TClient & TServer socket verbindung
 
10061 bedeutet, dass auf der Gegenseite kein Port offen ist, um eine Socket-Verbindung aufzubauen.

Was ist das für ein Server, auf den du connectest?

TobiasT 20. Okt 2006 15:21

Re: TClient & TServer socket verbindung
 
Der läuft auf dem selben rechner (darum 127.0.0.01)

Hab es hinbekommen die Fehlermeldung nicht anzeigen zu lassen!

Delphi-Quellcode:
procedure TForm1.ClientError(Sender: TObject; Socket: TCustomWinSocket;
  ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
ErrorCode:=0;

end;

Problem ist jetzt gelöst!

Vielen dank an alle die geholfen haben! :cheers: :kiss: :zwinker:


Mfg Tobias

inherited 20. Okt 2006 15:30

Re: TClient & TServer socket verbindung
 
o_O
Bitte schreib wenigstens den Fehler vorher in eine Log.


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