# Was brauche ich alles / wo sollte ich einen Blick drauf werfen?



## pro2 (19. Sep 2012)

Hallo zusammen,

erst einmal: Ich weiß, dass es hier ähnliche Themen gibt, wollte aber doch noch mal was Eigenes aufmachen, da meine Anforderungen noch etwas anders sind.

Ich hatte mal wieder eine tolle Idee, was ich programmieren will, weiß aber leider gar nicht, wo ich dabei anfangen soll. Was mal rauskommen sollte: eine Art Malanwendung. Jemand malt etwas und die anderen sehen quasi in Echtzeit, was dieser jemand malt. Ich möchte das ganze über einen Server machen. Dazu hätte ich einen Linuxserver. 

Ja, jetzt kommt es zur Programmierung und hier habe ich null Erfahrung. So eine schöne GUI, in der man etwas malt, das kriege ich noch hin. Aber ich habe null Erfahrung, wenn es um Netzwerkprogrammierung geht. Und dann muss ich ja auch noch die Serverseite programmieren, die dann allen Clients die Informationen weitergibt bzw. aufnimmt. 

Jetzt sind meine Fragen eigentlich nur die folgenden:
Was muss ich mir dafür alles angucken? Ist das überhaupt so ohne Weiteres möglich? Gibt’s da nützliche Tutorials, die man sich angucken könnte? Wo fängt man bei der Netzwerprogrammierung am besten an?

Danke im Voraus!


----------



## The_S (19. Sep 2012)

Da relativ häufig Daten ausgetauscht werden, würde ich auf jeglichen Overhead verzichten und einfach ServerSocket und Socket verwenden.


----------



## ARadauer (19. Sep 2012)

pro2 hat gesagt.:


> weiß aber leider gar nicht, wo ich dabei anfangen soll.





pro2 hat gesagt.:


> habe ich null Erfahrung.





pro2 hat gesagt.:


> Aber ich habe null Erfahrung, wenn es um Netzwerkprogrammierung geht.





pro2 hat gesagt.:


> Was muss ich mir dafür alles angucken?



Also wenn du keine Erfahrung hast würde ich ganz von vorne Beginnen... am Besten arbeitest du das Buch Java von Kopf bis Fuss mal komplett durch. Dann hast du die Grundlagen und kannst dir ausgewählte Kapitel von Java ist auch eine Insel zum Thema Netzwerkprogrammierung und Swing ansehen... Wenn du denkst du hast die Grundlagen schon drauf, kannst du dir direkt mal dieses Kapitel rein ziehen Galileo Computing :: Java ist auch eine Insel – 21 Netzwerkprogrammierung



pro2 hat gesagt.:


> Ist das überhaupt so ohne Weiteres möglich?


Ja sollte eigentlich nicht so schwer sein.... also richtig Profi mäßig mit 100.000 Usern wirst du nicht schaffen, aber eine kleine Server App dir dir Zeichen-Komandos zwischen Clients synchronisiert... sicher auch für einen Anfänger zu schaffen...


----------



## jamesv (21. Sep 2012)

ARadauer hat gesagt.:


> ...
> Ja sollte eigentlich nicht so schwer sein.... also richtig Profi mäßig mit 100.000 Usern wirst du nicht schaffen....



Dann hätte ich mal die Frage:
Wie sieht es denn aus, wenn man darauf achten muss, dass es wirklich viele User geben kann?
Worauf muss ich denn da besonders achten?
=)


----------



## The_S (21. Sep 2012)

jamesv hat gesagt.:


> Dann hätte ich mal die Frage:
> Wie sieht es denn aus, wenn man darauf achten muss, dass es wirklich viele User geben kann?
> Worauf muss ich denn da besonders achten?
> =)



Um mal ein paar Stichpunkte in den Raum zu werfen:

- User müssen trotzdem noch in vertretbarer Zeit ihre Anfragen beantwortet bekommen (Rechenkapazität)
- Anwendung muss ausreichend Speicherplatz haben, um alle Anfragen zu behandeln und ggf. Sessions zu verwalten
- Leitung muss dick genug sein
- ...

Interessante Stichpunkte zur Lösung:

- Clusterbildung
- Loadbalancer
- Caching


----------



## jamesv (21. Sep 2012)

Klingt sehr interessant, vielen Dank für die Stichpunkte 

Das werde ich mir mal anschauen, hast du da eventuell ein paar Links dazu griffbereit?


----------



## The_S (21. Sep 2012)

Google und Wikipedia  . Ansonsten würde ich in diesem Zusammenhang mal nach Java EE Architekturen/Servern suchen, sowas wird dann in der Regel auch nicht mehr mit Socket und ServerSocket laufen  .


----------



## jamesv (21. Sep 2012)

The_S hat gesagt.:


> Google und Wikipedia  . Ansonsten würde ich in diesem Zusammenhang mal nach Java EE Architekturen/Servern suchen, sowas wird dann in der Regel auch nicht mehr mit Socket und ServerSocket laufen  .




Macht natürlich Sinn 
Dankeschön.


----------



## tuxedo (24. Sep 2012)

Ist das für einen Netzwerk-Anfänger nicht mit Kanonen-auf-Spatzen geschossen? 

Wenn er doch gar keine Ahnung von Netzwerkprogrammierung hat: Wieso soll er sich dann gleich das Thema Cluster antun?

Wieso nicht "unten" anfangen Sockets und Strings hin und her schicken. Dann ggf. mit RMI weiter machen. Der "Overhead" ist da, wenn man keine extrem verschachtelten Objekte schickt, gar nicht so groß, eher sogar vernachlässigbar. 

Und die Sache mit den 1000 Clients... Nun, in keiner Anwendung ist in Version 1.0 alles erschlagen und nicht selten hat man irgendwann den Punkt erreicht wo man soviel dazu gelernt hat, dass man in Version 2.0 (oder 3.0, 4.0, 5.0, ...) große Teile neu schreibt, weil man einfach die Schwachpunkte während der Entwicklung von 1.0 erst richtig kennen gelernt hat und es nun besser weiß.

Wenn man Neuland betritt kann man nicht von vornherein alles richtig machen. Deshalb: Learning by doing...

- Alex


----------



## The_S (24. Sep 2012)

tuxedo hat gesagt.:


> Ist das für einen Netzwerk-Anfänger nicht mit Kanonen-auf-Spatzen geschossen?



Meine Empfehlung? Socket und ServerSocket? Nö, niedriger gehts ja fast gar nicht mehr  .



tuxedo hat gesagt.:


> Wenn er doch gar keine Ahnung von Netzwerkprogrammierung hat: Wieso soll er sich dann gleich das Thema Cluster antun?



Sollte man nicht. Hat ja auch niemand hier behauptet.



tuxedo hat gesagt.:


> Wieso nicht "unten" anfangen Sockets und Strings hin und her schicken. Dann ggf. mit RMI weiter machen. Der "Overhead" ist da, wenn man keine extrem verschachtelten Objekte schickt, gar nicht so groß, eher sogar vernachlässigbar.



Das war doch genau meine Empfehlung.



tuxedo hat gesagt.:


> Und die Sache mit den 1000 Clients... Nun, in keiner Anwendung ist in Version 1.0 alles erschlagen und nicht selten hat man irgendwann den Punkt erreicht wo man soviel dazu gelernt hat, dass man in Version 2.0 (oder 3.0, 4.0, 5.0, ...) große Teile neu schreibt, weil man einfach die Schwachpunkte während der Entwicklung von 1.0 erst richtig kennen gelernt hat und es nun besser weiß.
> 
> Wenn man Neuland betritt kann man nicht von vornherein alles richtig machen. Deshalb: Learning by doing...



Sehr richtig.

Ich schlage vor du liest den Thread noch einmal in Ruhe durch und achtest darauf wer was wann gepostet hat  .


----------



## homer65 (24. Sep 2012)

Du solltest auch nicht jedesmal das gesamte Bild über das Netzwerk senden.
Besser ist es nur die zugrunde liegenden "Maloperationen" zu senden.
Das dürfte den Traffic erheblich reduzieren.


----------



## tuxedo (24. Sep 2012)

@The_S

Ich hab den Thread gelesen. Und ich bin nach wie vor der Meinung: Stichwörter wie Clusterbildung, Loadbalancing oder JEE sind für einen Anfänger unbrauchbar und mit Kanonen auf Spatzen geschossen. 

Und ja, ich hab auch schon vor meinem ersten Post zur Kenntniss genommen dass du Plain-Socket-Kommunikation angeraten hast. 

@homer65

Kann ich nur Zustimmen. Das sollte man sogar mit RPC ohne große Schwierigkeiten performat genug hinbekommen. 

Zum Thema "viele User": Wieviel ist "viele"? Wenn's hunderte sind. Kein Thema. ein paar hundert klappen auch mit Java IO Sockets noch gut. Wenns eher in den 4 stelligen Bereich oder darüber hinaus geht: Java NIO (xSocket, Mina, Netty, ...) oder Java AIO (erst ab Java 7)...

Gruß
Alex


----------



## The_S (24. Sep 2012)

tuxedo hat gesagt.:


> @The_S
> 
> Ich hab den Thread gelesen. Und ich bin nach wie vor der Meinung: Stichwörter wie Clusterbildung, Loadbalancing oder JEE sind für einen Anfänger unbrauchbar und mit Kanonen auf Spatzen geschossen



Woher weißt du, dass jamesv ein Anfänger ist? Ich weiß das nur von pro2 und der hat die Frage ja nicht gestellt.


----------



## tuxedo (24. Sep 2012)

The_S hat gesagt.:


> Woher weißt du, dass jamesv ein Anfänger ist? Ich weiß das nur von pro2 und der hat die Frage ja nicht gestellt.



Jetzt hast du mich... Hatte das partielle Thread-Hijacking durch jamesv übersehen... :autsch:


----------



## The_S (24. Sep 2012)

tuxedo hat gesagt.:


> Jetzt hast du mich... Hatte das partielle Thread-Hijacking durch jamesv übersehen... :autsch:



Wusst ichs doch  . Wobei man natürlich auch sagen muss, dass mir pro2 ein Danke für meinen Beitrag zu JEE gegeben hat.


----------



## jamesv (24. Sep 2012)

hahaha
@Tuxedo
Ich wollte keine Verwirrung stiften  Aber die Frage bot sich halt in diesem Kontext an.


----------



## pro2 (25. Nov 2012)

The_S hat gesagt.:


> Wusst ichs doch  . Wobei man natürlich auch sagen muss, dass mir pro2 ein Danke für meinen Beitrag zu JEE gegeben hat.



Ich hab erst mal ein Danke für alles gegeben, was irgendwie hilfreich war. Hab dir ja auch keins für den Beitrag oben gegeben gehabt. 

So, das Thema ist jetzt schon etwas älter, aber in letzter Zeit hab ich endlich mal Zeit gefunden, mich ab und zu mal dranzusetzen. Hab dann auch in ein paar Büchern gelesen und geguckt, aber irgendwie sind die meisten Beispiele doch schon immer recht mager. Ich hab mir bisher dann aber doch mal alles zusammengebaut und bisher einen Chat implementiert, der auch soweit funktioniert. Es klappt auch, wenn mehrere Clients da sind usw. 

Jetzt hab ich aber eine Frage zur Umsetzung: Bisher habe ich es jetzt so gemacht, dass ich erst immer per String einen Befehl gesendet habe (jeweils in Richtung Client->Server oder Server->Client), diesen ausgewertet habe und dementsprechend die nächsten Pakete behandelt habe. Ist es eine halbwegs gute Umsetzung oder sollte man das anders machen? Und wenn ja, wie am besten?


----------



## trääät (25. Nov 2012)

nun ... das geht dann schon eher in richtung "Protokoll" ...

ein protokoll beschreibt in der regel wie welche daten in welcher reihenfolge zu interpretieren sind ...

und in der regel sendet man ja auch erst das kommando und dann die nutzdaten ... nur ob dies jetzt in zwei getrennten nachrichten machst oder in eine packst und einen eindeutigen trenner zwischen kommando und payload nutzt ist eigentlich ziemlich egal ...
eventuell fallen hier und da ein paar ops weg oder kommen hinzu ... aber grundsätzlich ist es ein protokoll nach dem schema : kommando - payload ... die implementierung ist dir überlassen


----------

