Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   MIDAS TSocketConnection, Reconnect (https://www.delphipraxis.net/181824-midas-tsocketconnection-reconnect.html)

Dejan Vu 11. Sep 2014 08:12

MIDAS TSocketConnection, Reconnect
 
Moin,

Einer meiner Kunden updatet seinen Windows-Server automatisch. Auf diesem Server laufen 3 Mittelschichten und der Borland Socket Server.

Nun zum Problem: Die Clients haben alle eine TSocketconnection und verbinden sich mit dem Sockenserver und dann läuft alles.

Wenn der Server aber nun neu startet, hängen einige Clients, vermutlich, weil im Client kein explizites Reconnect eingebaut ist.

1. Kennt jemand eine Lösung für das Reconnect-Problem in einer TSocketConnection?
2. Gibt es fertige Alternativen, die hier robuster sind?
3. Behandelt z.B. eine TWebConnection oder TDCOMConnection das Problem besser?

Die Anwendung ist noch in Delphi 6 geschrieben. Ein Umstieg auf XE7 wäre also mit erheblichen Kosten verbunden, kommt also nicht in Frage.

Für Tipps wäre ich sehr dankbar.

Grüße

Jumpy 11. Sep 2014 09:00

AW: MIDAS TSocketConnection, Reconnect
 
Ich hab das Problem auch in einer Delphi 6 Anwendung. Bei Abbruch der Verbindung wird der Error ausgelöst, was ich nutze um dem Nutzer im Client anzuzeigen, dass gerade keine Verbindung besteht. Hier müsste man eigentlich noch den Error genauer prüfen, aber mir ist es an der Stelle eigentlich egal, warum, hauptsache ich weiß, dass die Verbindung nicht mehr steht.

An dieser Stelle könnte dann auch ein Timer gestartet werden (ist bei mir nicht nötig, da eh einer läuft) der alle X Sekunden einen Reconnect versucht. In meinem Fall guckt er dazu in einer DB nach den Parametern für Host und Port, da es u.U. sein kann, dass ein anderer Server einspringt und der Client sich einfach mit diesem verbindet.

Delphi-Quellcode:
procedure TMain.ClientSocketError(Sender: TObject; Socket: TCustomWinSocket;
                                  ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
  if not ClientSocket.Active then
    LC.CreateWarnline;
  ErrorCode:=0;
end;

procedure TMain.TimerTimer(Sender: TObject);
begin
  //...

  //Da in meinem Fall der Server alle 30 sek. was schicken soll
  //prüfe ich u.a. im Timer, wie alt die letzte Nachricht ist.
  //So fällt ein Verbindungsabbruch auch ohne Error auf.

  if SecondsBetween(now,LastServerMessage) > 60 then
    if not ClientSocket.Active then
      begin
      ConnectToServer;
      end;

  if SecondsBetween(now,LastServerMessage) > 120 then
    begin
    ConnectToServer;
    end;
end;

mjustin 11. Sep 2014 09:35

AW: MIDAS TSocketConnection, Reconnect
 
Zitat:

Zitat von Jumpy (Beitrag 1272156)
Delphi-Quellcode:
procedure TMain.ClientSocketError(Sender: TObject; Socket: TCustomWinSocket;
                                  ErrorEvent: TErrorEvent; var ErrorCode: Integer);
...

Die MIDAS TSocketConnection Klasse und TCustomWinSocket (TClientSocket / TServerSocket) haben zwar beide mit TCP, aber wenig miteinander zu tun. AFAIK verwendete MIDAS intern bereits Indy, so wie aktuell DataSnap.

Dejan Vu 11. Sep 2014 09:53

AW: MIDAS TSocketConnection, Reconnect
 
Ich habe leider in der TSocketConnection keinen ErrorEvent, ich befürchte, ich muss in den Borland Quellcode rein. Wo hab ich nur den Staubsauger?

Ich hatte gehofft, das irgendwer vielleicht eine Lösung parat hat. Das Connection-Problem besteht ja ej bei allen TCP-Verbindungen, da es auch sein kann, das in einem Switch die Putzfrau an das Kabel gekommen ist und ein Disconnect noch nicht mal bemerkt wird.

Vielleicht muss ich mit einer zweiten Verbindung einfach Heartbeats hin und her schicken. Mal sehen.

Also wenn wem mal so eine Reconnectable TSocketConnection über den Weg läuft, immer her damit.

mjustin 11. Sep 2014 10:04

AW: MIDAS TSocketConnection, Reconnect
 
Zitat:

Zitat von Dejan Vu (Beitrag 1272168)
Also wenn wem mal so eine Reconnectable TSocketConnection über den Weg läuft, immer her damit.

Wir haben bei MIDAS / DataSnap den Weg des geringsten Widerstands gewählt und schliessen die Verbindung unmittelbar wieder, sofort nach ClientDataSet.Open wird disconnected. Und nach dem Update auch. Das macht den Server natürlich nicht stabiler. Aber es kommt seltener zu Störungen als bei Verbindungen, die beim Programmstart geöffnet und bis zum Programmende offen gehalten werden. Briefcase Modell halt.

Jumpy 11. Sep 2014 10:27

AW: MIDAS TSocketConnection, Reconnect
 
Zitat:

Zitat von mjustin (Beitrag 1272165)
Zitat:

Zitat von Jumpy (Beitrag 1272156)
Delphi-Quellcode:
procedure TMain.ClientSocketError(Sender: TObject; Socket: TCustomWinSocket;
                                  ErrorEvent: TErrorEvent; var ErrorCode: Integer);
...

Die MIDAS TSocketConnection Klasse und TCustomWinSocket (TClientSocket / TServerSocket) haben zwar beide mit TCP, aber wenig miteinander zu tun. AFAIK verwendete MIDAS intern bereits Indy, so wie aktuell DataSnap.

Wer (MIDAS) lesen kann ist klar im Vorteil. Ich hatte mich schon gewundert was Dejan Vu da für eine triviale Frage stellt, sorry. :oops:


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