Multiusereditor mit pipes?

Prengepower

Mitglied
Moin!

Wie vielleicht einige schon mitbekommen haben, arbeite ich zur Zeit an einem Multiuser-Editor.
Ich habe mir das so vorgestellt, dass halt mehrere Leute das Programm öffnen. Einer sagt: "Ich mach Host" und klickt dann auf den Button "Hosten".

Danach soll dann der Server gestartet werden. Die anderen Verbinden sich dann mit der IP des Hosters zu dem Server sodass die Verbindung zwischen allen besteht - soweit müsste das umsetzbar sein ne?

Jedenfalls stehe ich jetzt vor der Frage: wie mache ich das mit dem Multiuser-Quatsch ;) Generell hatte ich mir die Übertragung der neuen Daten so überlegt, dass ich nach jedem Zeichenanschlag (außer STRG, SHIFT, ALT,...) die Position auslese und das eingegebene Zeichen. Das wird dann zum Server geschickt und an alle anderen Teilnehmer der Session verschickt. Darauf wird dann aus diesen Informationen das Zeichen an der richtigen Stelle eingefügt und farblich in der Farbe des Autors markiert. Müsste ja so klappen oder?
Doch ich bin mir noch nicht sicher wie das mache wer grad schreibt... Ich habe mich ein bisschen umgehört und dürfte es folgende Varianten geben:

1) Button "Master"
Der der etwas schreiben will muss den Button Master klicken. Daraufhin wird bei den anderen Teilnehmern, dieser Button deaktiviert und erst wieder aktiviert, wenn der andere die Masterfunktion deaktivert hat. Dann kann der nächste --> ist eigentlich recht umständlich von der Bedienung her...

2) Automatische Mastervergabe
Sobald einer einen Tastenanschlag macht, wird dieser zum Master für beispielsweise die nächste Sekunde und die anderen sind gesperrt... --> Probleme bei gleichzeichtigem Tastenanschlag...

3) Named Pipes
Als ich mich während meinem Studium jetzt so ein wenig mit Pipes beschäftigen durfte kam mir die Idee. Ich könnte es komplett freilassen wann wer tippt.. Sobald jemand eine Eingabe macht, wird diese zuerst in eine Pipe weitergeleitet, welche vom Server erstellt wurde. Daraufhin greif der Server auf die Pipe nach dem FIFO-Prinzip zu und verarbeitet die ganzen Kommandos --> hört sich eignetlich am komfortabelsten an, aber ich bin mir nicht sicher ob es praktizierbar ist. Fakt ist, dass es die Klasse PipedOutputStream und so gibt...

Also was sagt ihr so zu meinen Ausführungen? Was ist praktikabel? Wie würdet ihr es machen? Habt ihr noch mehr Varianten auf dem Kasten? Kennt sich vielleicht jemand schon mit dem ganzen Problem aus?

Bin schonmal ganz gespannt auf hoffentlich viele interessante Beiträge ;)

Mfg
 
Hallo!

Das Projekt klingt interessant, birgt aber auch jede Menge technische Tücken... Im Folgenden gehe ich mal davon aus, dass die Verbindung zwischen den Teilnehmern bereits steht.

Zunächst mal zu der "Button Master" Variante: Das ist sicherlich am einfachsten zu implementieren, ganz trivial ist das aber trotzdem nicht: Was passiert z.B., wenn 2 Nutzer gleichzeitig auf den Button klicken? Genau genommen müssen alle Clients einen "Antrag" beim Server stellen, wenn sie schreiben wollen. Und der Server entscheidet, wem er Schreibrechte gewähren will.

Zur Idee "Automatische Mastervergabe" das gleiche Problem: Was soll passieren, wenn 2 Nutzer gleichzeitig anfangen zu tippen? Bis der Server das merkt und einem Client die Freigabe entzieht, sind da eventuell schon 10 Zeichen getippt worden... Sollen die dann einfach wieder entfernt werden?

Die dritte Variante halte ich persönlich für sehr aufwändig. Zum Beispiel könnte Nutzer A an der Stelle m 1 Zeichen einfügen. Kurz darauf fügt Nuter B an der n mit n>m ein weiteres Zeichen ein. Damit das Zeichen aber jetzt an der korrekten Stelle steht, müsste es in den von A veränderten Text an Position n+1 eingefügt werden... Und was soll passieren, wenn Teile des Textes entfernt werden, in denen ein anderer Nutzer gerade noch schreibt?
PipedOutputStreams helfen dir hier glaube ich auch nicht weiter...

Außerdem musst du dafür sorgen, dass alle Nutzer eine aktuelle Version des bearbeiteten Textes sehen - auch, wenn sie während dessen selber den Text modifizieren...

Mein Rat: Fang mit der einfachen Variante (1) an. Wenn das sicher klappt, kannst du immer noch umsteigen!

Gruß,

Robert
 
Zuletzt bearbeitet:
Zurück