AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Server-Antwort an mehrere Clients senden mit Indy
Thema durchsuchen
Ansicht
Themen-Optionen

Server-Antwort an mehrere Clients senden mit Indy

Ein Thema von Harry Stahl · begonnen am 16. Jun 2015 · letzter Beitrag vom 18. Jun 2015
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#11

AW: Server-Antwort an mehrere Clients senden mit Indy

  Alt 17. Jun 2015, 13:51
Wenn der Client aber dem Server neue oder geänderte Daten übermittelt, dann muss der Server die anderen Clients davon unterrichten, bzw. diesen die Änderungen mitteilen. Nur in diesen Fällen öffnet der Server auch eine Verbindung zu den Clients (und insofern arbeiten die Clients dann als Server).
Dies werden die Firewalls auf den Clients erst mal nicht erlauben.
Jop, sehe ich auch so. Die Lösung ist denke ich eher sub-optimal.

Versuche alles über die bestehende Verbindung zu machen. Du hast doch bereits je eine Verbindung zu den Clients offen (oder?), dann kannst du die Daten doch über diese schicken?

Was das non-blocking angeht: Wenn es dich interessiert, dann will ich dich nicht aufhalten. Aber von einer Notwendigkeit würde ich hier nicht sprechen. ^^
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.479 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: Server-Antwort an mehrere Clients senden mit Indy

  Alt 17. Jun 2015, 18:13
Wenn der Client aber dem Server neue oder geänderte Daten übermittelt, dann muss der Server die anderen Clients davon unterrichten, bzw. diesen die Änderungen mitteilen. Nur in diesen Fällen öffnet der Server auch eine Verbindung zu den Clients (und insofern arbeiten die Clients dann als Server).
Dies werden die Firewalls auf den Clients erst mal nicht erlauben.
Jop, sehe ich auch so. Die Lösung ist denke ich eher sub-optimal.
Dafür habe ich den Netzwerkverbindungstest entwickelt, welche die Anwender erst mal nutzen können, um die aus- und eingehende Verbindung zu testen und die Firewall entsprechend einzustellen (siehe anliegenden Screenshot).

[
Versuche alles über die bestehende Verbindung zu machen. Du hast doch bereits je eine Verbindung zu den Clients offen (oder?), dann kannst du die Daten doch über diese schicken?
Voraussetzung wäre dann, dass ich die Verbindung immer offen halte. Bislang habe ich nach jedem Server-Connect auch anschließend ein Disconnect durchgeführt.

Wenn ich aktiv mit dem Server was senden will, wie mache ich das? Ich habe gesehen, der Server hat eine Contexts-List. Nutze ich die, um an die Clients zu senden?

Und wie empfängt der Client die Daten? Die Client-Komponente hat doch gar kein On-Execute Event oder etwas vergleichbares.
Miniaturansicht angehängter Grafiken
servertest.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.479 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: Server-Antwort an mehrere Clients senden mit Indy

  Alt 18. Jun 2015, 10:58
Also dazu habe ich hier ein entsprechendes Thema gefunden:

http://stackoverflow.com/questions/5...nt-delphi-indy

Ich könnte dementsprechend einen Thread machen, der prüft, ob Eingänge vorliegen:
Delphi-Quellcode:
procedure TCommThread.Execute;
var
  Msg: String;
begin
  try
    while (AClient.Connected) do begin
       AClient.IOHandler.DefStringEncoding := IndyTextEncoding_UTF8;

       Msg := AClient.IOHandler.ReadLn;

       if Msg = 'irgendwas...then begin
         Sychronize (dasOderdas);
       end;

       if Msg = 'DisconnectClientthen begin
         break; // Thread beenden
       end;
    end;
  except
    on E:Exception do
      ErrorMsg := 'Error! ' + E.ClassName + '||' + E.Message;
  end;
end;
Nach ReadLn pausiert der IndyThread solange, bis eine Nachricht vom Server vorliegt.

Aber offesichtlich ist dann die Komponente solange auch nicht für das Senden von Nachrichten ansprechbar, oder?

Wenn ich versuchen mit der Componente etwas zu senden, kommt beim Server nur ein leerer String an (er sendet zwar, aber ohne Inhalt?).

EDIT: Korrektur: War mein Fehler, hatte beim Senden vergessen eine Kommandokennung zu setzen, geht also doch!!

Es ginge also tatsächlich mit nur einer Client-Server-Verbindung sowohl aktives Senden und Empfangen vom Client aus, so wie vom Server aus zu ermöglichen. Oder könnte sich da etwas ins Gehege kommen, wenn die Clientkomponente gleichzeitig wartet und gleichzeitig sendet?

Geändert von Harry Stahl (18. Jun 2015 um 11:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.479 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: Server-Antwort an mehrere Clients senden mit Indy

  Alt 18. Jun 2015, 13:06
Zwar kann man mit der Clietkomponente senden, aber nicht gleichtzeiig was zurücklesen, weil das der wartende ReaLn-Thread abfangen würde.

Das ist doof, weil man dann inderekt alles über den wartenden Thread machen müsste.

Das geht hier also nicht, während der ReadLn-Thread (siehe oben) wartet:

Delphi-Quellcode:
  With AClient do begin
    if Connected then begin
      IOHandler.DefStringEncoding := IndyTextEncoding_UTF8;
      try
        Temppassw := gns ('Password', FileInfo);
        IOHandler.WriteLn (FileInfo); // FileInfo contains the File to load
      except
      end;

      Tm:= TMemoryStream.Create;

      //sleep (1000); // Let the Server time to read the file

      try
        //while connected do begin
        InSize := IOHandler.ReadLn.ToInteger;
        IOHandler.ReadStream (TM, InSize, false);
        //end;
      except
      end;
  end;
end;
Hier gibt es eine Exception und der wartende ReadLn-Thread fängt mir hier das ReadLn ab (kriege also nicht den Wert von Insize).
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#15

AW: Server-Antwort an mehrere Clients senden mit Indy

  Alt 18. Jun 2015, 13:50
Leider kann ich dir mit Indy nicht weiterhelfen. Meine Delphi-Zeiten sind schon länger vorbei.

Üblicherweise bekommst du von einem Serversocket pro Verbindung ein eigenes Socket-Objekt. Die Methode nennt sich accept(). Die zurückgegebenen Sockets repräsentieren dann eine Verbindung zu einem Client. Man händelt also (Anzahl Clients + 1) Sockets in einem Server. Lesen und Schreiben auf solchen Sockets geschieht über read() und write() Methoden (meist blockierend).

Wie das mit Indy geht; keine Ahnung. Dazu gibt es aber doch sicherlich Beispiele? Google meint, es gibt sogar Thread-Pool Komponenten, die dir einen großen Teil der Arbeit abnehmen. Alternativ kannst du dich ja auch mit low-level Sockets befassen, wenn du Lust hast. Man lernt sicher einiges dazu.
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.479 Beiträge
 
Delphi 11 Alexandria
 
#16

AW: Server-Antwort an mehrere Clients senden mit Indy

  Alt 18. Jun 2015, 15:10
Zu diesem Thema gibt es anscheinend kaum Informationen im Netz.

Bei einem kurzen Implementierungstest zeigen sich mehrere Probleme. Ich lass das daher erst mal.

Habe mit der beidseitigen Kommunikationslösung (Client ist gleichzeitig auch Server) eine gut funktionierende Lösung gefunden will daher jetzt nicht mit allzu vielen Unbekannten quasi noch mal von vorn anfangen.

Aber dennoch vielen Dank für die interessanten Informationen und Denkanstöße.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 09:37 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