# Welche Technik sollte ich einsetzen



## Anton2k (27. Jan 2010)

Hallo,
Ich habe vor einiger Zeit mit Delphi ein Programm geschrieben was diese Funktionen hatte. 
Gemeinsamme Zeichenfläche, ein eingebauter Chat und die möglichkeit Bilder auf den Zeichenbereich zu laden.
Mittlerweile bin ich auf Java als Programmiersprache gekommen und soweit sehr zufrieden.

Einige Test Anwendungen zu diesem Thema hab ich mir schon erstellt. Ein einfacher Netzwerkchat ist ja kein Problem. RMI hab ich mir auch schon angesehen und kommt mir auch für viele Sachen als ne sehr schöne lösung vor. Aber mir fehlt noch so ein gesammtkonzept wie ich eine solche Netzwerkanwendung auf die Beine stellen soll. Wie man vieleicht merkt hab ich viele bereiche schon mal angelesen zu diesem Thema.

Ich muss mir letztendlich wohl ein Protokoll erstellen was Textnachrichten ermöglicht. Was das anflüstern von anderen Teilnehmern ermöglicht, was das übertragen der Zeichenoperationen erlaubt und zu guter letzt noch in der Lage ist eine Bilddatei zu übertragen.

Die letztendliche Frage ist: Wie bewerkstellige ich diese Netzwerkfunktionalität am besten? In Welchen bereich sollte ich mich tiefergehend einarbeiten für dieses vorhaben und gibt es direkt Tutorials die in diese richtung Abzielen.


----------



## Ice-Tea (27. Jan 2010)

Einen gemeinsamer Zeichenclient hatte ich in RMI bereits umgesetzt.
Damals wollte ich ein Spiel das sich auf einer Onlineplattform befindet nachbauen. (Einer Zeichnet, andere Raten)
Leider bin ich allerdings am RMI-Callback gescheitert (zumindest wenn eine Firewall im Spiel ist)

Ohne Firewall bzw. ohne callback ist RMI eine sehr einfache Geschichte.

Für ein Multiclient-Zeichenbrett würde ich allerdings nicht mehr auf RMI setzten.

Nachtrag:
Heute würde ich wohl eher auf einen einfaches UDP-Protokoll setzte, da es dann einfacher wird den 'Zeichnenden' (also der Client, der den Pinsel in der hand hält) zu wechseln


----------



## tuxedo (28. Jan 2010)

Für das Callback-Problem bei RMI gibts es ja mittlerweile eine Lösung *mit dem Zaunpfahl wink* 

- Alex


----------



## Firestorm87 (28. Jan 2010)

Kann Ich bestätigen, die funktioniert auch sehr zuverlässig 
@tuxedo: Du hast da seit paar Tagen nen Anhänger gewonnen


----------



## tuxedo (28. Jan 2010)

Danke für die Blumen 

Ein weitere Ausbau steht noch an. Dann kann man sich die Marker-Interfaces sparen und muss auch nicht jede RemoteException fangen. Aber das dauert wohl noch bis nach Fasching bis ich damit anfangen kann.

*back to topic*


----------



## Anton2k (3. Feb 2010)

Hallo
Es bleibt immer noch die Frage im Raum welches System am meisten Sinn macht.
Aktuell denke ich über ein Übertragungsobjekt nach welches ich Serialisiert über die Verbindung schicke. Das könnte dann dank div. Varaiblen alles von Text über Bilder ,... Transportieren.
Wobei ich ehr denke das es insgesammt zu unpraktikabel ist weil zu viel unnötiger Kram mit übertragen wird. Darum schätze ich ganz stark es gibt weit aus bessere methoden das in Java zu erledigen.


----------



## tuxedo (3. Feb 2010)

Anton2k hat gesagt.:


> Wobei ich ehr denke das es insgesammt zu unpraktikabel ist weil zu viel unnötiger Kram mit übertragen wird.



Kann ich nicht bestätigen. Wenn du dein Bild als byte[] verschickst: Wo ist dann unnötiger Kram dabei?

Klar, wenn du dein Bild in einer rieseigen Objekt-Hierarchie versteckt hast und da dann statt dem Bild den ganzen Parent-Ast übeträgst, dann ist viel unnötiger Kram dabei.

Lösungsmöglichkeiten (RMI, SIMON, RCP im allgemeinen, Bibliotheken wie MINA oder NETTY oder xSocket, "old school socket programming") gibts wie Sand am Meer. Man muss nur wissen was man haben will und dann mal eine Suche anwerfen.

- Alex


----------



## Anton2k (10. Feb 2010)

Ok meine Aktuelle idee ist also folgende.
Ich erstelle mir ein Netzwerk-Token objekt. Welches entsprechende Variablen enthällt. 
Ein String Array wo z.B. das erste den Typ angibt, und je nachdem welcher Typ die restlichen Felder genutzt werden für Chatnachrichten, Systeminformationen,..
Ein Byte Array welches ein Bild enthalten kann oder anders ja nach Typ des Packetes.

Alles was über das Netzwerk gehen würde währe dieses Token Objekt in Serialisierter form. Was entsprechend vom Emfänger benutzt wird.
Machbar ist es sicherlich so, aber auch sinnvoll? Bin da noch etwas festgefahren im Denken von den anderen Programmiersprachen wo ich es auch Packetorientiert gelöst hatte.


----------



## tuxedo (10. Feb 2010)

Das was du Token nennst, würde man eher DTO -> DataTransferObject nennen. 
Wenn du das wirklich so Flach hälst, dann ist das mit dem serialisieren eigentlich auch kein Problem. 

Problematischer wirds wenn dein DTO Objekt ein weiteres Objekt beinhaltet das nochmal X weitere Objekte inne hat. Dann muss der serializer sich alle Objekte anschauen und diese serialisieren.

Bleibst du aber bei einfachen Dingen wie primitive, Strings und Arrays aus solchen, dann spricht da nix dagegen. 

Wenn du dann noch den Nagle-Algo auf dem Socket abschaltest, dann geht das ziemlich Flott. 
Da der Object*Stream die Objekte cached ist es ratsam entweder für jedes Objekt einen neuen Stream zu benutzen, oder den Stream regelmäßig zu resetten. Infos hier: [JavaSpecialists 088] - Resetting ObjectOutputStream


----------



## Anton2k (10. Feb 2010)

Danke dann bin ich erst mal versorgt mit einem was ich testen kann um mich in die Materie zu vertiefen.


----------

