AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke ClientSocket soll viele Server schnell abfragen
Thema durchsuchen
Ansicht
Themen-Optionen

ClientSocket soll viele Server schnell abfragen

Ein Thema von holger_barntrup · begonnen am 19. Aug 2019 · letzter Beitrag vom 26. Aug 2019
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    
Benutzerbild von holger_barntrup
holger_barntrup

Registriert seit: 1. Feb 2007
Ort: Barntrup
97 Beiträge
 
Delphi 10.4 Sydney
 
#1

ClientSocket soll viele Server schnell abfragen

  Alt 19. Aug 2019, 08:05
Hallo und einen guten Morgen in die Runde.

Ich bräuchte mal einen Denkanstoß.
Ich habe eine kleine Hilfsanwendung mit einem ClientSocket realisiert mit dem ich mich mit verschiedenen Servern verbinden kann (CNC-Maschinen) und dort per ASCII Zeichenfolge verschiedene Daten abfrage.
Es sind nur ein paar wenige Maschinen, ich wähle eine aus einer Liste aus, verbinde mich und sende per Klick eine Abfrage wenn die Verbindung steht oder auch nicht wenn ich nur sehen will ob sie online ist.
Sollte eine Maschine nicht eingeschaltet sein dauert es etwa 20 Sec. bis ich die Rückmeldung bekomme. Solange muss ich warten. Bei den paar Maschinen kein Problem aaaaber jetzt sollen noch 50 weitere dazu.
Es sind ältere Maschinen mit reinen CNC Steuerungen die an Kommunikation nicht wirklich etwas können. Dort werden jetzt Digital zu Ehternet Klemmen eingesetzt die auch per ASCII abgefragt werden können. Also nicht viel anders als bisher.
Ich möchte das jetzt gerne automatisieren, also zyklisch alle xx sec. alle Maschinen abfragen. Wenn jetzt natürlich einige nicht online sind würde ich bei einer seriellen Abfrage sehr schnell viel Zeit verlieren die den nächsten Abfragezuklus vielleicht schon überschreitet.

Wie stelle ich das am geschicktesten und elegantesten an? Ich hab schon hier im Forum nach etwas vergleichbarem gesucht aber entweder fehlen mir die richtigen Suchbegriffe oder es wurde in der Form noch nicht behandelt.

Bringt mich mal bitte jemand auf die richtige Spur. Gibt es irgendwo Beispiele die ähnlich geartet sind?
Ich denke der Quelltext der vorhandene Hilfsanwendung spielt hier keine weitere Rolle.
Gruß Holger
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.581 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: ClientSocket soll viele Server schnell abfragen

  Alt 19. Aug 2019, 08:12
Du kannst einfach eine parallele for-Schleife benutzen und dabei in jedem Durchlauf einen eigenen TClientSocket erstellen. Dann brauchst du insgesamt nur einmal bis zum Timeout, weil alle quasi parallel angefragt werden.

Alternativ kannst du natürlich auch gleich einen richtigen Thread benutzen (bzw. diese Schleife im Thread). Das wäre sicher die beste Lösung, aber eben auch mit etwas Aufwand verbunden.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: ClientSocket soll viele Server schnell abfragen

  Alt 19. Aug 2019, 08:40
Hallo,
ich würde auch Thread(s) benutzen, die eine Queue füllen mit den aktuellen Online-Maschinen.
Im Prinzip laufen x Threads, deren einzige Aufgabe es ist, den Online-Status der x Maschinen zu prüfen/zu aktualisieren.

Die 20 Sekunden sind übrigens der Standard-Timeout von Windows.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von holger_barntrup
holger_barntrup

Registriert seit: 1. Feb 2007
Ort: Barntrup
97 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: ClientSocket soll viele Server schnell abfragen

  Alt 19. Aug 2019, 09:06
Da muss ich mich etwas einarbeiten, das sind momentan noch Böhmische Dörfer für mich.
Gruß Holger
  Mit Zitat antworten Zitat
Benutzerbild von holger_barntrup
holger_barntrup

Registriert seit: 1. Feb 2007
Ort: Barntrup
97 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: ClientSocket soll viele Server schnell abfragen

  Alt 19. Aug 2019, 09:25
Du kannst einfach eine parallele for-Schleife benutzen und dabei in jedem Durchlauf einen eigenen TClientSocket erstellen. Dann brauchst du insgesamt nur einmal bis zum Timeout, weil alle quasi parallel angefragt werden.
Das mit dem TParallel.For erscheint mir nicht unsympathisch, was mir da aber noch nicht klar ist wie ich die unterschedlichen IP Adressen zuweise.
Gruß Holger
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#6

AW: ClientSocket soll viele Server schnell abfragen

  Alt 19. Aug 2019, 09:39
Nun ja, so was wäre möglich
Delphi-Quellcode:
var
  addresses: tArray<string>;
begin
  addresses := ['a', 'b', 'c'];
  TParallel.&For(Low(addresses), High(addresses),
    procedure(index: Integer)
    var
      adr: string;
    begin
      adr := addresses[index];
      // mach was mit adr
    end);
end;
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
969 Beiträge
 
Delphi 6 Professional
 
#7

AW: ClientSocket soll viele Server schnell abfragen

  Alt 19. Aug 2019, 10:09
Hmm..

Optional könntest Du auch vorher per PING mit nem TimeOut von einer Sekunde (sollte im lokalen Netz reichen) abfragen..
Geht natürlich nur, wenn die Ethernetkarten der Maschinen ein Ping erlauben.

Aber so würdest Du schon wissen, ob sie eingeschaltet sind, bevor Du per TCP/IP dann eine Verbindung versuchst aufzubauen.
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)
  Mit Zitat antworten Zitat
ensaron

Registriert seit: 29. Aug 2008
Ort: 10369 Berlin
63 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: ClientSocket soll viele Server schnell abfragen

  Alt 19. Aug 2019, 11:04
Die Lösung via eigenem Thread wäre meiner Meinung nach von Vorteil, wenn das Abfrageintervall kürzer sein soll, als das maximal mögliche Timeout. Bei Verwendung von eigenen Threads könntest du dir eine Lösung programmieren, die vor dem Anlegen eines neuen Threads erst einmal die Liste der laufenden Threads durchgeht und nachschaut, ob zu der gewünschten Maschiene bereits ein noch offener Verbindungsversuch gestartet ist.
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
760 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: ClientSocket soll viele Server schnell abfragen

  Alt 19. Aug 2019, 14:20
Schau dir mal die ICSOverbyte WinSock Komponente an.

Alles ist Event gesteuert, nicht blockierend; dein Thread muss also zum Beispiel nach einem Connect Versuch (zu einer deiner Maschinen) nicht darauf warten, bis die Gegenstelle antwortet. Du kannst zu allen 101 Maschinen aufs Mal einen Connect Versuch starten und erhältst später via Ereignisse mitgeteilt, ob eine Session zustande gekommen ist, wenn sich ein Socket Status ändert usw. Es ist also völlig egal, wie lange der Verbindungsaufbau zu einer Machine X dauert: Da nicht darauf gewartet wird, ob und wann X antwortet, wird dein Thread nicht blockiert.


Ich habe mit ICS ein p2p Spiel programmiert: Ein User, welcher sich einloggt erhält eine nicht unbedingt sehr aktuelle Liste von Spielservern. Das Szenario ist also praktisch identisch. Alles läuft in einem Thread. In deinem Fall genügt für die Kommunikation (mit ICS) sicher der Hauptthread.
Michael Gasser
  Mit Zitat antworten Zitat
ensaron

Registriert seit: 29. Aug 2008
Ort: 10369 Berlin
63 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: ClientSocket soll viele Server schnell abfragen

  Alt 19. Aug 2019, 14:47
Ja die ICS Komponenten kann ich auch empfehlen. Wenn du mit Threads bisher noch nicht viel gemacht hast, dürftest du mit ICS schneller zum gewünschten Ergebnis kommen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz