Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Datei in Echtzeit "teilen" (https://www.delphipraxis.net/135995-datei-echtzeit-teilen.html)

64Jabor 21. Jun 2009 19:32


Datei in Echtzeit "teilen"
 
Liiiebe DP,

bevor einer meckert, JA ich HABE gesucht und nix gefunden, was mich überrascht hat, denn ich dachte, dass mein Problem schonmal jedem über den Weg gelaufen ist - eventuell habe ich aber auch einfach nur mit falschen Suchbegriffen gesucht :gruebel:

Das Problem ist folgendes:
Ich habe Webspace, auf dem ich eine Datei hochlade.
Mein Programm lädt sich die Datei herunter, liest sie ein, der Benutzer kann was ändern und seine Änderungen werden sofort wieder retour hochgeladen.
Soweit so gut...

Kommt nun aber ein zweiter Client hinzu, der eine Änderung vornimmt, während der andere gerade etwas anderes ändert, so würde die zweite Person nach der ersten die alte Datei hochladen mit lediglich seiner Änderung, sodass die Änderungen von Person 1 verworfen wären!
Meine Idee: Prüfen wir doch einfach vorher, ob die Datei die wir haben noch aktuell ist...
Aber was wenn nicht? In dem Fall bekommt Person 2 eine Meldung, dass die datei verändert wurde und er sich das doch bitte vorher erstmal anschauen soll, denn
eine GLEICHZEITIGE Änderung desselben Wertes wäre mit einfachem Download, Upload fatal!
Wollen wir diese Möglichkeit aber einfach erstmal ausschließen...
Okay das war langatmig und sinnfrei, hier nochmal einfach :D

Es geht eher allgemein darum, wie kann ich Informationen in Echtzeit in mehreren Clients synchron halten? Ich verstehe es im Moment einfach nicht!

Schonmal vielen Dank für eure Zeit...

himitsu 21. Jun 2009 19:42

Re: Datei in Echtzeit "teilen"
 
im Notfall kannst du auch einfach die Dateien sperren, sobald jemand daran arbeitet.

- Erster lädt eine Datei runter und diese Datei wird entsprechend auf dem Server makiert.
- Zweiter bekommt eine Meldung, daß diese Datei grade in Bearbeitung ist.
- Erster läd Datei hoch und sie wird wieder freigegeben
- Zweiter kann jetzt laden

- falls bei Erstem was passiert, wird auf dem Server nach einer Weile die Datei ebenfalls wieder freigegeben, so daß sie nicht ausversehn ewig blockert bleibt
(das Programm des Wweiten könnte auch noch in regelmäßigen Abständen seinen Bearbeitungsstatus aktualisieren, so mitteilen, daß er noch lebe und die Sperrzeit somit verlängert wird)


Ansonsten gab's hier vor 'ner Weile die Nachfrage nach so'ner Art "Live-Editor", wo Zwei/Mehrere über eine INetverbindung gleichzeitig an einer Datei arbeiten und beim jeweils Anderen die eigenen Änderungen sofort einfließen.

Dafür bräuchten die Programme aber sändige Verbindung zum Server oder eine zumindestens eine gegenseitige Verbindung.

64Jabor 21. Jun 2009 19:43

Re: Datei in Echtzeit "teilen"
 
Das wäre zwar eine Möglichkeit, aber ich will es ja ermöglichen, dass 2 Leute oder mehr, gleichzeitig Veränderungen vornehmen können!

himitsu 21. Jun 2009 19:44

Re: Datei in Echtzeit "teilen"
 
Zitat:

Zitat von 64Jabor
Das wäre zwar eine Möglichkeit, aber ich will es ja ermöglichen, dass 2 Leute oder mehr, gleichzeitig Veränderungen vornehmen können!

siehe meinen Nachtrag da oben : :lol:


Aber das Einfachere auch hier wäre, wenn man einfach Dateiteile sperrt, anstatt ganzer Dateien, so könnten die zumindestens an unterschiedlichen Teilen arbeiten und würden sich dennoch nicht in die Quere kommen :angel2:

jfheins 21. Jun 2009 19:48

Re: Datei in Echtzeit "teilen"
 
Wie wärs damit:

Wenn A die Datei runterlädt, und B zwischenzeitlich was ändert und danach A seine Änderungen hochladen will passiert folgendes:

A bekommt die Datei in einer Art Splitscreen-Modus, sodass er die beiden Verionen genau vergleichen kann :)

64Jabor 21. Jun 2009 19:52

Re: Datei in Echtzeit "teilen"
 
Die Idee finde ich sehr gut!
Aber richtig Echtzeit...ich meine ich kann die Datei auch nicht einmal pro Sekunde runterladen, dann ist das ja nur am rumlaggen, nich

@jfheins
Ja das hatte ich bisher so gehabt, nur ich fand das halt blöd, ich fände es am besten, wenn jede Änderung sofort dargestellt würde, nur weiß ich halt nicht wie ich das realisieren soll...

Zerolith 21. Jun 2009 20:04

Re: Datei in Echtzeit "teilen"
 
Hallo 64Jabor,

Mir fallen auf Anhieb zwei Wege ein wie ich das lösen würde:

- Bevor Benutzer 1 die Datei läd, erstellst du eine "LOCK" Datei (Dokument1.doc wird angefordert, Dokument1.doc.LOCK wird erzeugt)
- Benutzer 2 fordert die gleiche Datei an, und erhält bei der Prüfung ob eine Lock Datei für diese Datei existiert eine "Bitte warten" Meldung oder so. Damit kannst du sichergehen dass nur ein User die Datei bearbeiten kann.

Der zweite Weg wäre bestimmt besser für dein Anliegen, aber auch deutlich umfangreicher. Und ich bin mir nicht sicher ob du Shell-Zugriff auf deinen Webserver hast:

- Socket-Server (Unter Linux: PHP, RUBY, Freepascal) der die Anmeldung der User und den Dateitransfer steuert
- zu diesem verbindest du dich mit einem Socket-Client den du dir mit Delphi baust
- Der Ablauf könnte dann ähnlich wie beim Versionierungssystem "Subversion" (SVN) laufen:
- CHECKOUT Datei (Datei laden)
- Bearbeitung durch den Benutzer
- UPDATE eventuelle Änderungen die zwischenzeitlich gemacht wurden laden
- Lokale Datei mit der aktuellen Remote Datei vergleichen und die Änderungen manuell durch den Benutzer einpflegen lassen
- oder automatisiert mit einem Merge-Tool (z.B. TortoiseMerge) "zusammenführen" (gibt bestimmt Commandline Tools dafür)
- COMMIT Die lokale (zusammengeführte) Datei zurückschicken

Bestimmt ist auch eine Mixtur aus beidem möglich.

EDIT: Ach, sehe gerade dass ein paar Andere hier ähnliches vorschlagen :-)

alzaimar 21. Jun 2009 20:11

Re: Datei in Echtzeit "teilen"
 
Ich stell mir das lustig vor, wenn nicht nur 2 Leute, sondern 20 an ein und derselben Datei rumfrickeln. Wozu soll das denn führen? Auch wenn das irgendwie nett wäre, das man direkt die Änderungen der Anderen mitverfolgen könnte, praktikabel ist das sicherlich nicht, eher eine visuelle Spielerei. Ich könnte mir auch vorstellen, das es eine Herausforderung wäre, das optimal hinzubekommen.

Du willst doch eine praktikable Lösung für das Problem "Gleichzeitiges Ändern einer Datei". Die ganze Datei zu sperren wäre eine Nöglichkeit, aber das ist vielleicht ein wenig zu viel des Guten.

Mach dir mal Gedanken über die Struktur und die kleinste sinnvolle Einheit, die exklusiv zu bearbeiten wäre. Nehmen wir ein Textdokument, irgendeine Abhandlung. Der besteht aus Kapiteln, Abschnitten, Absätzen, Sätzen, Wörtern und Buchstaben.

Welches Element ist hier das kleineste sinnvoll exklusiv zu bearbeitende? Ich würde plädieren, das es der 'Abschnitt' ist, auf jeden fall *nicht* so wie Du es willst, der Buchstabe.

Wenn wir also unsere Datei in 'Abschnitte' unterteilen können, können wir die einzeln sperren und jede Änderung den anderen zugänglich machen. Ob das live geschehen muss, sei mal dahin gestellt.

Reinhard Kern 21. Jun 2009 21:07

Re: Datei in Echtzeit "teilen"
 
Zitat:

Zitat von 64Jabor
Das wäre zwar eine Möglichkeit, aber ich will es ja ermöglichen, dass 2 Leute oder mehr, gleichzeitig Veränderungen vornehmen können!

Das ist schon klar, ist ja auch eine lohnende Aufgabe, denn damit wirst du schlagartig weltberühmt. Die vielen tausend Entwickler von Datenbanken wie DB2, Oracle, MySQL usw. haben das Problem nämlich bisher nicht lösen können. Die arbeiten meistens, für dich unvorstellbar primitiv, mit Satzsperren, m.a.W. es können viele an einer Kundendatei arbeiten, aber nie 2 am gleichen Kunden.

Gruss Reinhard

Satty67 21. Jun 2009 21:18

Re: Datei in Echtzeit "teilen"
 
Das geht schon, wenn Du schon mal an einem Remote-Desktop gearbeitet hast, bei dem der User auch noch rum tippt, weist Du wie viel Spass das bringt.

alzaimar hat es ja schon gesagt, es macht keinen Sinn, weshalb bekannte Lösungen logisch kleinste Bereiche sperren.

alzaimar 21. Jun 2009 22:04

Re: Datei in Echtzeit "teilen"
 
[quote="Reinhard Kern"]
Zitat:

Zitat von 64Jabor
m.a.W. es können viele an einer Kundendatei arbeiten, aber nie 2 am gleichen Kunden.

Das stimmt so nicht. Person A arbeitet an den Adressdaten, Person B an den Bankverbindungen. Beide können ohne Probleme gleichzeitig am Kunden herumsezieren und die Daten auch speichern (Es werden natürlich nur die Änderungen gespeichert). Im Allgemeinen ist es unkritisch, wenn Änderungen auf elementarer Ebene nicht gleichzeitig (mehrere Personen verändern ein und das selbe Feld) geschehen. Wenn ja, kann man gegensteuern. Entweder durch Satzsperren (hier: Feldsperren) oder durch Reconcile-Strategien, wobei die Einfachste die ist, der zweiten Person den Konflikt anzuzeigen ("Person A hat die Adresse auf 'XYZ' geändert, Sie auf 'ABC'. Welche Version ist gültig?").

Cyf 21. Jun 2009 22:49

Re: Datei in Echtzeit "teilen"
 
Je nachdem, für was das sein soll, klingt hier auch der Einsatz von SVN ganz naheliegend.

Fridolin Walther 21. Jun 2009 23:00

Re: Datei in Echtzeit "teilen"
 
[rant]SVN ist das Böse ;).[/rant]

Ansonsten zum Thema:
Das was Du Dir da vorgenommen hast ist alles andere als trivial. Du magst mehr oder weniger quasi in Echtzeit das Bearbeiten des selben Dokuments durch mehrere Leute ermöglichen. Je nachdem was für eine Art Dokument das ist, sollte man schauen ob sich die Sache nicht evtl. anders lösen lässt.

Wenn Du Dich partou nicht von der Idee trennen magst, kannst Du ja mal schauen wie Google dieses Concurrency Problem in Google Wave gelöst hat.

uwewo 22. Jun 2009 07:28

Re: Datei in Echtzeit "teilen"
 
Hi,

zuerst einaml habe mir nicht alles durchgelesen, falls doppel Posting Sorry,

Warum nicht in jeder Tabelle ein Feld "Änderung" Typ TimeStamp anlegen und das dann einfach vergleichen ;-)

Uwe

64Jabor 22. Jun 2009 22:20

Re: Datei in Echtzeit "teilen"
 
Das artet aus, ich sehs schon :D

ALso was ich will, ist zB. ein Blatt Papier auf dem jeder malen kann, als Beispiel.
Nun soll das halt möglichst in Echtzeit mitzuverfolgen sein.
Das Problem ist denke ich, dass ich Textdateien verwendet habe, die ja jedesmal als ganzes heruntergeladne werden (müssen?)
Würde ich zB. nur die Position eines Punktes durchgeben - und eine Linie besteht ja nunmal aus vielen Punkten, wäre dies wahrscheinlich wesentlich schneller.
Das ließe sich aber kaum mit Webspace realisieren, sondern wohl eher mit einer Serverversion meines Programmes, das als Verteiler dient, und dafür müsste ich mein Konzept bisher über den Haufen werfen ^^

himitsu 22. Jun 2009 22:42

Re: Datei in Echtzeit "teilen"
 
Der Server (bzw. auch ein "billiges" PHP-Script) muß ja nur die IPs der Rechner kennen und dann unterhalten die Programme sich direkt und schicken sich nur noch die Änderungen untereinander hin und her.

uwewo 23. Jun 2009 22:16

Re: Datei in Echtzeit "teilen"
 
Anscheinend verstehe ich Dein Problem nicht, oder Du hast mein Vorschlag ignoriert!!!!
Wäre die letzte Änderung jedes Datensatzes per TimeStamp protokolliert,(Das machte TimeStamp automatisch) ist es doch einfach beim hochladen nur die Datensätze zu ersetzen, die ein neueres Datum bzw. Uhrzeit haben.

Uwe

Der.Kaktus 24. Jun 2009 05:34

Re: Datei in Echtzeit "teilen"
 
Hallo, nutzt Du keine Netzwerkfaehige Datenbank?..Damit waer es kein Problem, da Du Datensaetze einzeln sperren kanns wenn sie in Bearbeitung sind.

64Jabor 24. Jun 2009 14:14

Re: Datei in Echtzeit "teilen"
 
Nein ich benutze keine Datenbank, ich habe Delphi 7 Personal, denke das kann soetwas gar nicht =/

Ich muss zugeben deinen Vorschlag mit dem TimeStamp hatte ich schlichtweg überlesen xD
Also ich sollte einen TimeStamp der letzen Änderung in meiner Datei für jeden Datensatz mitspeichern und dann nur die neueren Datensätze speichern, aber wie ist da gewährleistet, dass die Änderung bei anderen angezeigt wird?
Ich meine wenn ich die Zahl 30 habe und ich sehe meine Datei gleichzeitig an mit jemand anderen, ich verringe auf 25, er dreht sie hoch auf 35, dann sieht er bei seiner Änderung zu keiner Zeit, dass ich die Zahl gerade runterschraube, oder?

Vielleicht muss es aber auch gar nicht so kompliziert sein würde ich davon ausgehen, dass nie der gleiche Datensatz bearbeitet würde.
Dann wäre die Sache mit einem TimeStamp wiederum leicht zu realsisieren...

Fridolin Walther 24. Jun 2009 14:16

Re: Datei in Echtzeit "teilen"
 
Ich mag mich ja nicht aufdrängen (obwohl: doch eigentlich schon ;)) aber genau Dein Problem ist wie gesagt in der Google Wave Protokoll Spezifikation erläutert: http://www.waveprotocol.org/whitepap...onal-transform.

Ebenfalls interessant zu Deinem Problem ist der Wikipedia Eintrag zum entsprechenden Themengebiet (Operational Transformation): http://en.wikipedia.org/wiki/Operational_transformation

64Jabor 24. Jun 2009 22:13

Re: Datei in Echtzeit "teilen"
 
@Fridolin
Ja ich hatte mir den Link bereits angesehen, aber mein Schulenglisch weißt da doch die ein oder andere Lücke auf =/
Ich werde mal googlen ob es dazu was deutsches gibt :D
vielen dank, so weiß ich jetzt wonach ich suchen muss =)

mjustin 25. Jun 2009 07:20

Re: Datei in Echtzeit "teilen"
 
Zitat:

Zitat von 64Jabor
ALso was ich will, ist zB. ein Blatt Papier auf dem jeder malen kann, als Beispiel.
Nun soll das halt möglichst in Echtzeit mitzuverfolgen sein.
...
Das ließe sich aber kaum mit Webspace realisieren, sondern wohl eher mit einer Serverversion meines Programmes, das als Verteiler dient, und dafür müsste ich mein Konzept bisher über den Haufen werfen ^^

Im Prinzip ist es nicht viel mehr als ein 'Chatprogramm' (mit Grafikoperationen anstatt Textausgabe). Theoretisch könnte man es auch mit Peer-to-Peer Verbindungen lösen, in denen der Anwender, der z.B. einen neuen Kreis malt, die Position und Größe an alle anderen Teilnehmer sendet. Dabei müssten nur die IP Adressen der Teilnehmer untereinander bekannt sein.

Wenn aber Nachrichten durch Netzwerkstörungen verloren gehen, sind die Dokumente nicht mehr überall auf dem gleichen Stand. Das könnte man beheben, indem die Dokumente über das gleiche System mehrfach übermittelt werden, also ein eingebautes Fehlerkorrekturverfahren.

Robuster wäre ein Publish/Subscribe System, bei dem ein Server die Nachrichten zentral empfängt, und dann an alle angeschlossenen Clients verteilt. Der Server wäre dann so etwas wie ein Rundfunksender, und beliebig viele Clients könnten einen bestimmten Kanal wählen und von dort Nachrichten empfangen. Sie könnten aber auch Nachrichten an den Kanal senden und würden damit alle aktuellen Zuhörer erreichen.

Bekannte Vertreter dieser Art von Systemen sind z.B. Amazon Simple Queue Service oder Apache ActiveMQ. Der Amazon Service ist kostenpflichtig und relativ eingeschränkt, ActiveMQ dagegen Open Source und auch für zehntausende 'Kanäle' und Benutzer ausgelegt.

64Jabor 25. Jun 2009 10:49

Re: Datei in Echtzeit "teilen"
 
@mjustin
Das Problem wäre hier für mich der Server =/
Ich möchte nicht jedesmal an alle meine Router-IP rausgeben, damit das Programm läuft und ich will sie ja auch nicht zb auf dem Webspace hinterlegen, der für jeden einsehbar wäre...
Am liebsten wäre mir da die Methode, dass die Clienten sich eintragen und dann untereinandern kommunizieren


Alle Zeitangaben in WEZ +1. Es ist jetzt 01: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