Frage

Ich habe eine klassische Client / Server (Fat-Client und Datenbank) Programm geschrieben in Delphi 2006. Wenn bestimmte Bedingungen in dem Client erfüllt sind, muss ich sehr schnell alle anderen Kunden benachrichtigen. Bisher wurde dies unter Verwendung von UDP-Broadcasts getan, aber das ist nicht mehr rentabel wie jetzt Kunden von außerhalb des LAN verbinden und die UDP-Broadcast an das lokale Netzwerk beschränkt ist.

Ich bin mir bewusst, die Indy-Bibliotheken, aber ich bin nicht wirklich sicher, welche Komponenten verwendet werden und wie sie strukturieren. Ich vermute, ich werde einen Server haben müssen, dass die Clients eine Verbindung zu, die die Nachrichten empfangen und verbreiten ...? Irgendwelche Proben gibt, um mich begonnen?

Gibt es andere Komponentensätze oder Technologien soll ich stattdessen aussehen / als auch?

War es hilfreich?

Lösung

Die einfache Antwort ist, dass die Standardprotokolle in Delphi (und anderen Werkzeugen) erlauben keine Benachrichtigung in umgekehrter Richtung. Ich sah in dem für ein Projekt, wo ich wollte SOAP verwenden. Sie alle übernehmen Client fragt Server, Server antwortet und das ist es.

Für mich war die Lösung der RemObjects SDK. Auf diese Weise können Sie Benachrichtigungen an Kunden senden, und die Benachrichtigung alle Daten haben, können Sie (wie dem Client-Server) mögen. Ich selbst verwende ich die SuperTCP Verbindung, aber es funktioniert mit anderen auch. Es kann immer noch eine SOAP-Schnittstelle für Kunden anbieten, die es verwenden müssen, aber für, wo Sie die Kontrolle über Client und Server haben es funktioniert sehr gut.

Andere Tipps

Es gibt ein paar wirklich einfache Möglichkeiten, dies mit Delphi zu tun, obwohl ich bin sicher, dass das RemObjects SDK wirklich gut funktioniert auch.

  1. Haben Sie einen zentralen Server, der ein * TIdTCPServer Hören hat * drauf. Dann hat jeder Kunde einen TIdTCPClient auf sich. Sie verbinden mit dem Server und Block auf einer Lese warten für die Server schreiben . Sobald empfängt der Server eine Benachrichtigung über eine Abhörsocket es Sendungen zu jedem der Warte Kunden. Das ist so ziemlich sofortige Benachrichtigung aller Kunden.
  2. Haben Sie einen zentralen Server, der eine TIdTCPServer listenin g auf sie. Dann hat jeder Kunde einen TIdTCPClient auf sich. Diese Clients können "ping" der Server für Updates in regelmäßigen Abständen zu fragen (eine Session-Token Zustand zu halten). Die Häufigkeit des Intervalls bestimmt, wie schnell die Meldung sein wird. Wenn einmal einer der Clients, die andere benachrichtigen muss, benachrichtigt er nur den Server. Der Server verwendet dann eine Nachrichten-Warteschlange eine Liste aller aktiven Client-Sitzungen zu machen und fügt eine Benachrichtigung für jeden. Dann das nächste Mal jeder der Clients verbindet sie die Anzeige und entfernen Sie sie aus der Warteschlange gibt.
  3. Achten Sie auf eine Sitzungstabelle in der Datenbank, wo jeder Kunde regelmäßig aktualisiert, dass sie eine aktive Sitzung haben, und entfernt sich, wenn sie trennt. Sie erhalten einen Wartungsprozess benötigen, die tot Sitzungen entfernt. Dann haben Sie eine Nachrichten-Warteschlangentabelle , dass ein Client ein Update mit einer Zeile für jede aktuelle aktive Sitzung schreiben. Dann werden die anderen Clients regelmäßig die Tabelle pingen können, um zu sehen, ob es irgendwelche ausstehenden Benachrichtigungen für seine Sitzung sind, wenn es sie sie lesen können, wirken auf sie und dann sie entfernen.
  4. Irgendeine Art von Peer to-Peer-Ansatz waren die Kunden voneinander in der Datenbank durch Informationen bewusst sind, und dann verbinden sie direkt miteinander und benachrichtigen oder für Benachrichtigungen stellen (abhängig von der Firewall und NAT Konfigurationen). Ein wenig komplex, aber möglich.

Offensichtlich ist die Wahl der Implementierung auf Ihrer Einrichtung und Bedürfnissen ab. Tunning wird notwendig sein, um die besten Ergebnisse zu erzielen.

Die Komponenten, die Sie dafür brauchen die sind TIdTCPServer (Hörer) und TIdTCPClient (Sender). Beide sind in den Indy-Bibliotheken in Delphi.

ICS-Komponenten von http://www.overbyte.be sind groß. a.) Eine bessere Kompatibilität als Indy b.) Postkarte ware Gute Beispiele und Unterstützung. Verwenden TClientSocket und TServerSocket

FirebirdSQL Projekt das Konzept der Benachrichtigungen verwendet als Server-Client-Verbindungen sein, die eine Zeichenfolge an den Client senden. Dazu verwendet der DB-Server einen anderen Port. Und benötigen Sie den Client registrieren ist es interessant, eine bestimmte Art von Benachrichtigung über einen API-Aufruf zu empfangen.

Sie könnten die gleiche Idee.

RabbitMQ sollte Ihre Rechnung passen. Der Server ist kostenlos und einsatzbereit. Sie brauchen nur eine Client-Seite zu verbinden, Push / Nachricht senden und erhalten / benannte Meldung ziehen

Server: http://www.rabbitmq.com/download.html Führen Sie eine Google für Client oder selbst implementieren

Prost

Es soll möglich sein, Multicast UDP für den gleichen Zweck zu verwenden. Der einzige Unterschied wird sein, die Multicast-Gruppe von jedem Client zu verbinden.

http://en.wikipedia.org/wiki/IP_Multicast

http://en.wikipedia.org/wiki/Internet_Group_Management_Protocol

Edit: Nur um zu klären, Multicast kann Sie eine bestimmte "Gruppe" im Zusammenhang mit einer Multicast-IP-Adresse verbinden. Jedes Paket an diese Adresse gesendet werden jeden Kunden erreichen, der die Gruppe hat beitreten

Sie können WeOnlyDo wodVPN Komponente sehen, die Sie erlauben eine robuste UDP Lochen zu erstellen und einen Port-Forwading oder einen normalen VPN (mit einem fornished Netzwerkadapter) gewinnen, so können Sie zwei PC hinter einem NAT verbinden.

Ich bin mit dieser Steuerung für unser Kommunikationsprogramm und funktioniert sehr gut.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top