2009-08-16 7 views
1

ich bauen will eine Win32-Anwendung von Client/Server (oder 3-Tier) Typ mit Follow-Feature:Kommunikation unter den Kunden in Delphi 2009

  • Wenn die "A" Client eine Änderung tut (aktualisieren, einfügen, etc) in eine Datenbank, kann der Rest der Kunden den gleichen Datensatz sehen bekommt fast „sofort“ einen frischen Blick auf diesen Daten
  • ein Client benachrichtigt werden kann, wenn eine Verbindung zur Datenbank

jemand verloren gehen könnte Hilf mir? Vielen Dank im Voraus

PDTA: Meine Datenbank ist MySQL 5.1

Antwort

2

Beachten Sie, dass dadurch, und mit vielen Clients, Sie möglicherweise viel Netzwerkverkehr erhalten. Dies ist genau der Grund, warum die meisten Client-Server-Anwendungen dies nicht tun.

Wenn Sie das wirklich tun wollen, dann ist das richtige, das "Beobachtermuster" zu implementieren; ein grundlegendes Beispiel für dieses Entwurfsmuster in Delphi has been described by Joanna Carter in ihrem Blog.

Dann müssen Sie dieses Muster erweitern, damit es über ein Netzwerk funktioniert. Zumindest brauchen Sie einen Server-Prozess, der die "Betreff" -Schnittstelle behandelt. Sie können alles dafür verwenden: WebServices, DataSnap Server, RemObjects SDK usw.

Die meisten Menschen eine Lösung wie diese wollen, von der traditionellen Client/Server-Anwendung in eine Multi-Tier-Anwendung gehen. Dann kann die mittlere Schicht alle Benachrichtigungen für Sie behandeln.

-1

Wenn MySQL doesnt Unterstützung somekind info Schub- oder attatching Kunden Sie eine mittlere Ebene läuft auf einem Server verwenden, benötigen würden. Dieser Server verfolgt verbundene Clients. Aber es wäre wahrscheinlich ein Job.

Ich weiß, dass die "größeren" Editionen von Delphi einige Unterstützung beim Aufbau dieser Art von Client/Server-Software haben.

-1

Ich weiß, es hat nichts mit Ihrer Anwendung zu tun, aber Firebird hat eine nette Funktion, genau dies zu tun. Sie können mehr über sie lesen here (Link zu einem PDF).

Nun, wenn Sie dies mit MySQL und Delphi tun müssen, ist der einfachste Weg, an den ich denken kann, etwas "AJAX LIKE" in Ihrer Win32-App zu tun. Das ist eine serverseitige App (Sie könnten einen WebServer mit PHP, Java, .NET oder was auch immer Sie wollen) verwenden, der Ihren Anfragen nach Datenaktualisierungen dient. Führen Sie in der serverseitigen App einfach eine Abfrage aus, in der Sie nach Änderungen in Ihrer MySQL-Datenbank gefragt werden.

Ich hoffe, es hilft.

2

Meine Antwort hängt von Ihrer Netzwerkarchitektur ab, aber ich neige dazu, IP für diese Art von Sache zu verwenden. Etwas wie Multicast ist eine ideale Möglichkeit, um alle Kunden über das Netzwerk eines Ereignisses zu benachrichtigen. Einfaches Multicasting oder Broadcasting (UDP) genügt, um die ID des aktualisierten Datensatzes zu erhalten. Wenn ein anderer Client an dem Datensatz interessiert ist, kann er ihn von der Datenbank aktualisieren.

Die Indy Multicast Client/Server-Komponenten bieten eine einfache Möglichkeit, dies in Ihrer App zu implementieren.

+1

Wir verwendeten etwas ähnliches (aber grob überbaut) bei einem früheren Arbeitgeber. Wahrscheinlich müssen Sie nur eine Tabellenkennung, eine ID und eine Operation (hinzufügen/aktualisieren/löschen) senden. –

+1

Multicast funktioniert nur in Ihrem lokalen LAN (und nur, wenn die Switches Multicast-Pakete weiterleiten); Billiardo sollte das Beobachtermuster verwenden. –

0

Wenn Sie eine Anwendung mit drei Ebenen haben, kommuniziert der Client mit dem Anwendungsserver. Diese Verbindung könnte Rückrufe zu den Clients verwenden, um sie über wichtige Ereignisse zu informieren. DataSnap unterstützt Callbacks (afaik auch Datenänderungsbenachrichtigungen).

Wenn Sie Ihren eigenen Anwendungsserver erstellen. Der Client könnte eine Socket-Verbindung zum Server (in einem Thread) öffnen und auf Ereignisbenachrichtigungen warten. Das Indy Telnet-Clientbeispiel in Protocols/IdTelnet.pas ist ein guter Ausgangspunkt, um eine sehr einfache Benachrichtigungsimplementierung zu erstellen. Es verwendet die TIdTelnetReadThread-Klasse, um auf die Serverantworten auf wichtige Eingabe- und Protokollverhandlungen zu warten.

Wenn Ihre Anwendung in Terminal Server-Umgebungen ausgeführt werden muss, in denen keine AFAIK-Ports virtualisiert werden, ist es sicherer, eine Verbindung vom Client zum Server herzustellen (statt Client-Socket-Ports für Peer-to-Peer-Kommunikation zu öffnen).