# Peer to Peer Verbindung zwischen mehreren Clients?



## facilityManager (3. Nov 2008)

Das hat mich schon immer mal interessiert: Wie funktioniert das mit dem Peer-to-Peer?

Ich möchte ein Programm schreiben, womit mehrere Leute zusammenarbeiten können. Person A geht online und macht eine "Session" als Host auf. Personen B und C gehen online, und sehen das es da ne hübsche Session von Person A gibt, der sie beitreten können. Also freuen sich Person B und C und treten der Session bei.

Können Java-Programme per Internet miteinander kommunizieren, wenn der Host-Rechner ein stink normaler Otto-Normal-Verbrauchs-Computer mit normalem Internetanschluss und sich ändernder IP ist, und kein Webserver in einem Rechenzentrum?


----------



## tuxedo (3. Nov 2008)

>> Wie funktioniert das mit dem Peer-to-Peer? 

TCP und UDP ;-) Wikipedia hilft auch weiter ...

>> Ich möchte ein Programm schreiben, womit mehrere Leute zusammenarbeiten können. Person A geht online und macht eine "Session" als Host auf. Personen B und C gehen online, und sehen das es da ne hübsche Session von Person A gibt, der sie beitreten können. Also freuen sich Person B und C und treten der Session bei. 

Das "finden" einer solchen Session ist "übers Internet" nicht ohne eine zentrale anlaufstelle, wo verzeichnet wird, dass es diese Session gibt, und wo alle neuen Clients nach einer Session "suchen", möglich. Sprich: In so einem Fall brauchst du sowas wie einen Webserver, RootServer oder ähnliches.

>> Können Java-Programme per Internet miteinander kommunizieren, wenn der Host-Rechner ein stink normaler Otto-Normal-Verbrauchs-Computer mit normalem Internetanschluss und sich ändernder IP ist, und kein Webserver in einem Rechenzentrum?

Jupp. Damit die Clients aber mit der regelmäßig wechselnden IP zurecht kommen und nicht jedesmal zum Telefon greifen müssen und sich nach der neuen IP des "Servers" erkundigen müssen, gibt es sogenannte "Dynamic DNS Server". Dort kann der Server sich eine Namensadresse geben lassen, welche dann von ihm immer mit der aktuellen IP auf den neusten Stand gebraucht wird.

--> www.dyndns.com

Kostet bei bis zu 5 solcher Adressen pro Account nix. Benutze ich selbst schon seit Jahren.

- Alex


----------



## facilityManager (3. Nov 2008)

Danke für die ausführlichen Infos! Baut man heutzutage noch Socketverbindungen von Hand, oder gibt es dafür empfehlenswerte Libs?


----------



## tuxedo (3. Nov 2008)

Hä? Wie? Von Hand? Du meinst mit Assembler oder wie?

Was du vermutlich meinst: Gibt es Libraries die weit genug von der Low-Level Socketverbindungen abstrahieren?

Wenn das die Frage war: Ja. 

Jetzt irgendetwas aufzuzählen wäre zu viel des guten. Es gibt einfach zu viel. Du solltest wenn dann etwas konkreter mit deinen Anforderungen werden.

Nichts desto trotz, solltest du, bevor du irgendetwas anfängst, erstmal das Prinzip verstehen. In der Java-Insel ist das ganz gut erklärt. Sprich: Wie macht man einen Socketserver und wie macht man einen Socketclient.
Ist nict schwer, sind nur ein paar Zeilen, die es aber dennoch in sich haben können (wenn man von der Materie so gar keine Ahnung hat).

- Alex


----------



## facilityManager (3. Nov 2008)

> Was du vermutlich meinst: Gibt es Libraries die weit genug von der Low-Level Socketverbindungen abstrahieren?



genau.

Habe da einen guten Link: java.sun.com/developer/onlineTraining/Programming/BasicJava2/socket.html das werde ich mir erstmal zu Gemüte führen.

Danke für die Infos!


----------



## tuxedo (4. Nov 2008)

Ja, das ist für den Einstieg nicht schlecht. Da ist auch gleich den multithreaed Server erklärt.

Wenn du das beherrschst, und weißt was du letztendlich mit der Anwendung machen willst, kannst du ja immer noch auf eine Library die auf einem höheren Level abstrahiert zurückgreifen.

- Alex


----------



## facilityManager (4. Nov 2008)

Funktioniert super mit dem Socket! Wie geht das denn, wenn Objekte übertragen werden sollen? Schätze mal die werden serialisiert und als String übertragen. Beispiel: Multiplayer-Game. Aber das ist ja erst ein fortgeschrittenes Thema, wenn ich mit dem Multithreading-Server durch bin


----------



## tuxedo (4. Nov 2008)

Du kannst mit dem ObjectInputStream und ObjectOutputStream ganze, serialisierbare Objekte serialisieren.

ABER: Wenn du wirklich performance haben willst, dann schickst du nicht ganze Objekte hin und her, sondern ausschließlich die daten, die wirklich von interesse sind. Hilfreich ist hierbei der DataInputStream und DataOutputStream. Damit sparst du dir den Rechenaufwand mit der Serialisierung sowie Bandbreite und Gewinnst an Performance. 

Allerdings hast du zum "Nachteil" dass du dich selbst drum kümmern musst was wie und wo geschickt wird, und musst dir somit ein etwas aufwendigeres Protokoll überlegen.

Wenn du aber mal tief genug eingestiegen bist in die Materie, kannst du dir ja mal "Project Darkstar" von Sun anschauen. Nix für ungut, aber das wird wohl noch ne Weile dauern bis du soweit bist (ist kein leichtes Thema, zumal die Doku doch noch etwas dürftig ist...)

- Alex


----------



## facilityManager (4. Nov 2008)

Project Darkstar habe ich mal gesehen. Verstand aber nicht so richtig, worum es geht.

An der Serialisierung ist was dran. Es wird auch gesagt, das die Serialisierung von Objekten Probleme machen kann. Dann doch lieber ein eigenes Protokoll.

Zunächst spiele ich mit dem Gedanken ein ganz einfaches Multiplayer-Game zu realisieren. Vom Konzept her dient StarCraft als Vorbild. Da muss ich erst ein paar Dinge evaluieren. 
Etwa die Synchronisation der Gameloop mit allen Teilnehmern;
Behandlung von Lags (Übertragungsprobleme / Aussetzer);
Map;
Bewegungs- und Navigationsalgorithmen (Einheiten müssen sich dem Gelände und Hindernissen entsprechend automatisch von A nach B bewegen; Oder es gibt erstmal nur Lufteinheiten...lol);
JMonkey für grafische Effekte;

Ansonsten soll es 2D sein, mit "Pseudo-3D Effekt", der durch die Reihenfolge der Zeichnung realisiert wird.

Soviel zum Übungsprojekt ;-)


----------

