AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Kommunikation zweier Instanzen im Lan (DB-Polling vs. TCP)!
Thema durchsuchen
Ansicht
Themen-Optionen

Kommunikation zweier Instanzen im Lan (DB-Polling vs. TCP)!

Ein Thema von TheMiller · begonnen am 16. Feb 2010 · letzter Beitrag vom 17. Feb 2010
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#1

Kommunikation zweier Instanzen im Lan (DB-Polling vs. TCP)!

  Alt 16. Feb 2010, 20:21
Hallo,

ich stehe vor einem Problem

Ich habe ein Programm geschrieben, mit dem in einem Netzwerk ca. 10 Leute arbeiten. In diesem Programm ist eine Benutzerliste mit dem Online/Offline-Status und die Möglichkeit, den Usern Nachrichten zu schreiben.

Da einige Leute auch via VPN über einen SurfStick ins Lan kommen, würde ich gerne verhindern, ständig die MySQL-Datenbank nach Änderungen des BenutzerStati und neuen Nachrichten zu fragen.
Problem ist, dass das ganze Programm dann lahmt.

Deshalb wollte ich diese Sachen auf TCP (IdTCPServer/Client) umstellen. Doch hier ist das Problem, dass die User nicht immer die selbe IP haben (echte Lan-IP, VPN-IP mehrere Netzwerkkarten etc).

Ich brauche mal eure Entscheidungshilfe. Es geht also um TCP-Kommunikation vs MySQL-Polling.

Die SQL-Abfragen könnte ich in Threads packen. Damit würde das Programm nicht mehr lahmen. Nachteil wäre, dass nervige Fehlermeldungen kommen, wenn der Server nicht erreichbar ist/wird.

TCP ist direkt, geht schnell und nur dann, wenn man es braucht. Ich würde, wenn User C online kommt, allen anderen Usern eine TCP-Message wie "/updateOnlineUser" senden und die würden dann die Datenbank abfragen und sich die neuen Stati holen.
Nachteil hier ist die wechselnde IP-Adresse. Dagegen habe ich gearbeitet, indem ich zu jedem User bei Programmstart in der DB alle IP-Adressen speichere und dann, eine nach der anderen durchgehe und schaue, welche richtig ist. Diese speicher ich dann im User-Objekt (User.IP). Doch das hin-und-her von TCP-Messages, UpdateCommandos etc nimmt bei vielen Usern viel Zeit in Anspruch (gerade über VPN).

Ich bräuchte - wie gesagt - eure fachliche Meinung, Vor- und Nachteile oder ganz und gar andere Lösungen.

Vielen Vielen Dank im Voraus
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#2

Re: Kommunikation zweier Instanzen im Lan (DB-Polling vs. TC

  Alt 16. Feb 2010, 22:46
Einfach ein Broadcast via UDP, um alle Clients um Netzwerk herauszufinden. Diese melden dann ihre IP zurück. Es gibt auch einen Thread dies bzgl irgendwo, hab den aber noch nicht gefunden.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#3

Re: Kommunikation zweier Instanzen im Lan (DB-Polling vs. TC

  Alt 16. Feb 2010, 23:40
Hm ja, udp war auch mein erster Gedanke. Habe dann aber gesehen, dass udp-Broadcasts nicht ohne Weiteres durch einen VPNTunnel wollen. Die UDP-BC müsste man erst in ein raw-Packet umwandeln, via TCP senden, Checksums berechnen und wieder umwandeln...

Das ginge also auch nicht.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Kommunikation zweier Instanzen im Lan (DB-Polling vs. TC

  Alt 17. Feb 2010, 07:16
Du brauchst also ein Chat-Programm? Na das sollte nicht so schwer zu finden sein.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#5

Re: Kommunikation zweier Instanzen im Lan (DB-Polling vs. TC

  Alt 17. Feb 2010, 11:52
Nein, ich brauche kein Chat-Programm

Also. Das Programm ist modular aufgebaut und hat momentan ca. 11 Plugins. Unter anderen Kalender und Telefonnotizen. Im Hauptprogramm befindet sich eine Übersichtsseite und die Userliste. Diese Bereiche sind immer sichtbar. AUf der Übersichtsseite befindet sich eine kleine Liste mit den heutigen Terminen, Aufgaben und Tel-Notizen.

Nun möchte ich die Übersichtsseite und die User-Liste (On/Off) aktuell halten. Derzeit verwende ich dazu die db-polling Technik, indem ich einen Timer alle x Sekunden die db abfragen lasse. Der Chat (eher im SMS-Style gehalten) ist sekundär.

Ich wollte eigentlich bei Änderungen bei den gebieten "Neue Tel-Notizen, heutige Termine, Neue Aufgaben, User online gekommen, User offline gegangen" über TCP Strings schicken (eine Art Kommando) und bei Empfang dieses String die spezielle Aktualisierungs-Methode aufrufen

"if (s = "/updateTasks") then UpdateTasks"

Aber da das durch die VPN-Geschichte etwas kompliziert ist, weis ich nicht, ob sich dieser Aufwand lohnt. UDP durch VPN ist ja auch so eine Sache...

Für weitere Vorschläge oder Pro- und Contras bin ich dankbar.
  Mit Zitat antworten Zitat
franktron

Registriert seit: 11. Nov 2003
Ort: Oldenburg
1.446 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#6

Re: Kommunikation zweier Instanzen im Lan (DB-Polling vs. TC

  Alt 17. Feb 2010, 12:02
So was ähnliches hab ich auch gerade.
Das ist ganz einfach im OnConnect vom idTCPServer die IP des Client in einer TList speichern und beim Diesconnect wieder löschen und schon sieht man wer gerade online ist.

P.S. man kann auch Daten in die TList schreiben z.b. Username
Frank
Tux sein Lieblingsquellcode
While anzfische<TuxSatt do begin
Fisch:=TFisch.Create; Tux.EssenFisch(Fisch); Fisch.Free;inc(anzfische); end;
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#7

Re: Kommunikation zweier Instanzen im Lan (DB-Polling vs. TC

  Alt 17. Feb 2010, 12:54
Oder (wenn das eine Option ist) du nimmst eine (vernünftige ) Datenbank, die Events unterstützt ... z.B. Firebird.
Da lässt du die DB ein Event an alle angemeldeten Clients schicken, das sich was geändert hat. Und die gucken dann nach, was los ist und zeigen den aktuellen Stand der Dinge an.
So machen wir das.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#8

Re: Kommunikation zweier Instanzen im Lan (DB-Polling vs. TC

  Alt 17. Feb 2010, 14:04
Ja, habe gestern auch gelesen, dass FB sowas kann. Aber nein, das ist keine Option. Leider.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Kommunikation zweier Instanzen im Lan (DB-Polling vs. TC

  Alt 17. Feb 2010, 14:26
Also wenn du keine vernünftige Datenbank (wie Oracle) hast, dann baust du dir eben einen TCP-Server auf den Datenbankrechner, und alle anderen Clients verbinden sich dahin.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#10

Re: Kommunikation zweier Instanzen im Lan (DB-Polling vs. TC

  Alt 17. Feb 2010, 17:15
Zitat von DJ-SPM:
Ja, habe gestern auch gelesen, dass FB sowas kann. Aber nein, das ist keine Option. Leider.
Ein zweistufiges Polling wäre noch eine Alternative.

Dazu benötigt man eine kleine Tabelle in der Zeitstempel für Ereignisse eingetragen werden. D.h. wenn ein neuer Termin erfasst wird, aktualisiert das Programm in dem der Termin erfasst wird die ZEIT-Spalte der Zeile für 'Neuer Termin':

EREIGNIS ZEIT
Neuer Termin 2010-02-15 08:01:00 <-- Update
Neue Aufgabe 2010-02-15 08:04:00
Neue Notiz 2010-02-15 07:01:00
...

Jeder interessierte Client fragt diese Tabelle in kurzen Zeitabständen ab und vergleicht den Zeitstempel mit dem zuletzt gelesenen Wert. Erst wenn dieser Wert sich ändert, wird das eigentlich Select ausgeführt, das zu höherer Last führte.

Vorteil: keine weiteren Ports oder Chatserver erforderlich, arbeitet auf der bestehenden Basis. Nachteil: je nachdem wie schnell man die Ereignisse erkennen muss, muss auch diese Eventabfrage in entsprechend kurzen Zeitabständen erfolgen - mit Nachteilen für Netz- und DB-Belastung, aber deutlich weniger als bei einem Voll-Polling

Viele Grüße,
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 01:17 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