AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy 10 asyncrone ServerInfo an Clients?
Thema durchsuchen
Ansicht
Themen-Optionen

Indy 10 asyncrone ServerInfo an Clients?

Ein Thema von stahli · begonnen am 27. Okt 2012 · letzter Beitrag vom 28. Okt 2012
Antwort Antwort
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#1

Indy 10 asyncrone ServerInfo an Clients?

  Alt 27. Okt 2012, 00:43
Ich habe erfolgreich eine Client/Server-Anwendung mit IdTCPServer und IdTCPClient (10) angefangen.
Die Kommunikation funktioniert perfekt (Client fragt an, Server antwortet).

Nun möchte ich, dass der Server gelegentlich von sich aus alle Clients über Neuigkeiten informiert. Die Clients entscheiden dann, ob und welche Daten sie abrufen.
Mit den Sockets war das ja recht einfach.

Wie macht man´s mit den Indys 10 am besten?


Diesen Schnippsel habe ich gefunden:
Delphi-Quellcode:
var
   cList: TList;
   Count: Integer;
 begin
   cList := IdTCPServer.Contexts.LockList;
   try
     for Count := 0 to cList.Count -1 do
       with TIdContext(cList[Count]) do
         Connection.IOHandler.WriteLn ('...');
   finally
     IdTCPServer.Contexts.UnlockList;
   end;
 end;
Ist das der beste Weg? Wie sieht die Cielt-Seite aus? Ohne Timer oder Thread wird es nicht gehen - oder?
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

AW: Indy 10 asyncrone ServerInfo an Clients?

  Alt 27. Okt 2012, 02:29
Normalerweise sollte das so laufen:
Server sendet an Client eine Message.
Im Client wird ein Event ausgelöst. (WinSock kann hier eine WM_SOCKET Message in die Message Queue legen)
In der Klasse TClientSocket aus der Unit ScktComp.pas gibt es dazu das Event OnRead.
http://docwiki.embarcadero.com/Libra...mSocket.OnRead

Der Client liest die bisher angekommenen Daten aus dem Socket und hängt sie an einen Puffer an.
Dann wird untersucht, ob der Puffer eine vollständige Message enthält (erkennbar am abschliesenden Return-Zeichen).
Jede vollständige Message wird aus dem Puffer ausgeschnitten und ausgewertet/bearbeitet.
Die Bearbeitung kann im Hautpthread (da das Event als Windows-Message erzeugt wurde, befinden wir uns im Kontext des Hauptthreads) durchgeführt werden oder einen anderen Thread übergeben werden.

Ich würde Indy nur dann verwenden, wenn gleichzeitig auch ein Protokoll wie z.B. POP3, SMTP, FTP, ... eingesetzt werden muss.
Wenn man sein eigenes Protokoll benützt und im Prinzip nur TCP/IP braucht, dann hat man mit Indy eine riesige Bibliothek aus der man nur 2% des Codes braucht.
Leider gibt es in Indy auch keine Trennung zwischen Datentransport (also TCP/IP oder UDP/IP) und dem eigentlichen Protokoll.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#3

AW: Indy 10 asyncrone ServerInfo an Clients?

  Alt 27. Okt 2012, 07:30
(sorry für OT)
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Indy 10 asyncrone ServerInfo an Clients?

  Alt 27. Okt 2012, 11:17
Ich hatte mein Testprojekt mit den Sockets angefangen. Das funktionierte dann auch ganz gut, allerdings kam ich mit der Übertragung von Streams und der GUI-Syncronisation (noch) nicht zurecht.

Daher habe ich es mit den Indys versucht und das soweit auch ganz gut realisieren können: http://www.delphipraxis.net/170904-i...ml#post1188420

Die syncrone Verbindung (ein Client fragt an und der Server antwortet ihm über die durch die Anfrage geöffnete Verbindung) finde ich auch nicht schlecht.

Da bis hierher mein Projekt sehr gut läuft würde ich (zumindest vorerst) bei den Indys bleiben wollen. Später kann man das ja imnmer noch umstellen, aber ich würde jetzt erst mal gern inhaltlich weiter kommen.
Mir fehlt eigentlich erst einmal nur die Realisierung einer eigenmächtigen Info vom Server zum Client.

Also falls jemand dazu einen Indy10-tauglichen Tipp hat...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.123 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Indy 10 asyncrone ServerInfo an Clients?

  Alt 27. Okt 2012, 11:31
ich hatte mal hierzu was auf Stackoverflow gefunden,
aktuell kann ich nur diesen Link anbieten http://stackoverflow.com/questions/5...-transfer?rq=1
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.123 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Indy 10 asyncrone ServerInfo an Clients?

  Alt 27. Okt 2012, 11:35
oder mak nach two communication suchen http://boardreader.com/thread/Two_wa...3hwX584ep.html
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Indy 10 asyncrone ServerInfo an Clients?

  Alt 28. Okt 2012, 21:12
Hmm, ich habe am WE mal nach einer Lösung, bin aber nicht weiter gekommen.

Vom Server aus kann ich ja offenbar alle Clients mit der o.g. Funktion anschreiben.
Ist auch hier so beschrieben.

Aber wenn das so gelingt, wie bekommt denn der Client dann das Ereignis mit?

Notfalls würde ich die Clients (vorerst) zyklisch beim Server einen Zeitstempel der letzten Änderung abfragen lassen, aber so richtig schön ist das ja nicht...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

AW: Indy 10 asyncrone ServerInfo an Clients?

  Alt 28. Okt 2012, 22:38
Die Indy Komponenten sind alle blocking, das bedeutet sie reagieren nicht (wie z.b. die standard Socket Komponenten) auf bestimmte Window Messages, sondern müssen selbst für eingehende Daten lauschen.

Normalerweise geht man hier so vor, dass man pro Client einen Thread erstellt, welcher die Datenempfangsschleife implementiert. Prinzipiell kann das bei den Indys ein einfaches ReadLn() sein. Der Call blockiert solange, bis tatsächlich Daten anliegen.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Antwort Antwort


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 11:45 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