Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi verbindung zum server? Client/server Sockets (https://www.delphipraxis.net/117221-verbindung-zum-server-client-server-sockets.html)

Jackie1983 14. Jul 2008 13:39


verbindung zum server? Client/server Sockets
 
hi,

habe eine Client/Server anwendung. Der Client sendet Daten an den Server.
Wenn aber keine Internetverbindung besteht oder der server nicht erreichbar ist soll der client beim nächsten mal wenn er online ist die Daten senden.

Habe jetzt nur nicht wirklich eine idee wie ich es umsetzten kann das der client prüft ob er mit dem server verbunden ist.

Habe es bis jetzt so gelöst
Client will Daten senden
Client sendet Ping
Server antwortet Pong
Wenn Pong da, sendet Client die Daten

was ist aber wenn kein pong kommt Verbindung trennen und wenn ich wieder Daten senden möchte versuchen wieder eine Verbindung aufzubauen?

Was meint ihr?

Die Muhkuh 14. Jul 2008 13:42

Re: verbindung zum server? Client/server Sockets
 
Du könntest die zu schickenden Daten einfach in eine Liste packen.

Wenn der Server mit Pong antwortet, gehst Du die Liste durch und sendest die Daten. Antwortet der Server nicht, fügst Du neue Daten einfach in die Liste ein und sendest erst, wenn Du wieder ein Pong vom Server bekommst.

Jackie1983 14. Jul 2008 13:44

Re: verbindung zum server? Client/server Sockets
 
so habe ich es auch gemacht, nur wenn die Verbindung mal zum Server getrennt wurde muss ich sie ja wieder aufbauen.

Die Muhkuh 14. Jul 2008 13:46

Re: verbindung zum server? Client/server Sockets
 
Und wo ist da das Problem?

Du hast ja sicherlich eine Methode, die zum Server verbindet. Wenn Du nun keine Verbindung hast, versuchst Du wieder eine aufzubauen.

Jackie1983 14. Jul 2008 15:13

Re: verbindung zum server? Client/server Sockets
 
so weit funktioniert das es ja auch aber irgend wie auch wieder nicht :)
Delphi-Quellcode:
procedure TMyClient.Send(var Cmd: TCommandHandling; SendNow : Boolean; FreeCmd : Boolean);
var
  s : string;
  StartTime : double;
  cs : TCriticalSection;
begin
  if not fIsOnline then GoOnline('127.0.0.1',12345);
  application.ProcessMessages;
  cs := TCriticalSection.Create;
  cs.Enter;
  //Daten im Buffer ablegen
  fQoS.QoS_Buffer := fQoS.QoS_Buffer + cmd.SendFrames;
  //Jetzt senden oder Sammeln
  if not SendNow then
    if length(fQoS.QoS_Buffer) < fQoS.QoS_SendSize then exit;

  if not fIsOnline then exit;//wird bei OnConnect auf true gesetzt
  fPingPong.SendePing;
  StartTime := now + 2.2*(2.2/86400.0);
  //Ping gesendet warte auf Pong
  while (not fPingPong.fPong) and (StartTime > now) do
  begin
    sleep(1);
    application.ProcessMessages;
  end;
  //Ist Pong ok und zeit nicht abgelaufen, also verbunden, sende daten
  if fPingPong.fPong then
  begin
    fPingPong.fPong := false;
    //Daten senden
    s := fQoS.QoS_Buffer;
    fQoS.QoS_Buffer := '';
    fClient.Socket.SendBuf(PChar(s)^,length(s));
  end else // wenn kein pong server nicht da -> off
    if fIsOnline then
      GoOffline;
  application.ProcessMessages;
  //Freigeben
  if FreeCmd then cmd.Free;
  cs.Leave;
end;
so klappt es auch aber nicht immer wenn ich debugge und las mir "zeit" beim debuggen funktioniert es immer.....

Vielleicht findet ja jemand einen Fehler oder weis wie man es besser / eleganter lösen kann....


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