Socket Problem mit Netzwerkverbindung über TCP

Pringler

Mitglied
Hi Leute,
Ich bin gerade dabei ein kleines bombermanartiges Spiel zu programmieren, welches natürlich eine Multiplayeroption übers internet haben soll.
Bis jetzt habe ich normale Sockets für die Verbindung benutzt.
Ein User hat die möglichkeit einen Server zu erstellen, wobei er die ganzen berechnungen für das Spiel durchführt und die ergebnisse an die clienten weitergibt die sich bei ihm eine Verbindung aufbauen.

In einem lokalen Netzwerk funktioniert alles wunderbar, jedoch eine erfolgreiche Verbindung zu Rechnern im Internet bekomme ich nicht. (Der Methodenaufruf Socket socket = new Socket(String ip, int port); wirft bei dem externen clienten eine connectexception)

Nun ich weiß, dass die Router an denen die Rechner hängen ein hindernis sind .. und der user immer den port freigeben muss den er als server benutzt. Um das dem user nicht zutrauen zu müssen, dachte ich mir ich kann als port den http-port (port 80) benutzten, da der normalerweise so wie so schon bei allen routern freigegeben ist.

Beim recherchieren bin ich leider noch auf keinen grünen zweig gekommen :rtfm:
, wie ich dieses netzwerk übers internet realisieren kann.
 
Öhm... Port 80 ist (sinnvoller Weise) nur bei WebServern freigegeben. Und nicht nur freigegeben, sondern auch besetzt. Desweitere hat es nichts mit Portfreigabe zu tun, sondern vielmehr mit Portweiterleitung. Deswegen wirst du da nichts mit anfangen können. Außerdem gibt es keinen Port, der "bei allen normalerweise freigegeben ist". Ohne irgendwelche Tricks (angewandelte Version von UDP Hole Punching oder so) wirst du da nicht weiter kommen. Du könntest dir auch die peer-2-peer Netzwerke nach möglichen Lösungen anschauen, denn da ist das Problemm immer noch aktuell.

Aber halte deine Benutzer nicht für dumm, jeder der es braucht wird schon eine Portweiterleitung einstellen können. Du kannst ja notfalls auf irgendwelche Anleitungen zum Thema verlinken.
 
Zuletzt bearbeitet:
Unterstützend könntest du dein Programm mit UPnP ausstatten. Sofern der Router UPnP beherrscht und auch aktiviert hat, kann ein Programm mit UPnP Funktionalität den Port im Router selbst freigeben, ohne dass der Nutzer selbst hand anlegebn muss. Azureus/Vuze können das z.B. auch.

Allerdings sind wohl die meisten Router in der Werkseinstellung mit ausgeschaltetem UPnP konfiguriert. ABER sofern der User das schon einmal eingeschaltet hat, kann dein Programm davon profitieren.

Ansonsten bleibt dir wirklich nur, wie schon erwähnt wurde, UDP Hole Punching und/oder ein P2P System, ODER - was noch nicht erwähnt wurde - ein "vermittelnder Server" der direkt erreichbar ist. Aber Server kosten Geld..... 🙂

- Alex
 
Also danke schonmal für die vielen Antworten (endlich mal ein Forum in dem geholfen wird) 😛
An einen vermittelnden Server habe ich auch schon gedacht, und es gibt genug kostenfreie server zu mieten, die java unterstützen (speicherplatz benötige ich so wie so nicht sehr viel).
Denoch möchte ich lieber auf andere Methoden zugreifen.

Kann mir jemand erklären was genau dieses UDP-Hole-Punching Prinzip ist.
Ich habe es schon öfters gelesen und auch versucht es zu googlen, jedoch weiß ich immer noch nicht genau wie udp hole punching funktioniert. Irgendwie tu ich mich in diesem Thema etwas schwer.

Also ich denke mal beim udp hole punching kann ich mir die idee mit den streamsockets abschmicken und muss auf datagrammsockets umsteigen, ist ja auch alles halb so wild.

Nur wie sieht so eine implementierung für so ein UDP-Hole-Punching aus?
Dabei möchte ich nochmal anmerken, dass die User später das Spiel einfach nur starten müssen ohne irgendwelche vorkehrungen am router oder sonstwo treffen müssen.

Danke schonmal im vorraus 🙂
 
An einen vermittelnden Server habe ich auch schon gedacht, und es gibt genug kostenfreie server zu mieten, die java unterstützen (speicherplatz benötige ich so wie so nicht sehr viel).
Vermutlich meinst du, dass es genug kostenfreie WebHosting Angebote gibt, die "java applet unterstützen". Das ist ja völlig was anderes. Außerdem brauchst du denn zwar kein Speicherplatz, dafür aber Trafic.

Kann mir jemand erklären was genau dieses UDP-Hole-Punching Prinzip ist.
Ich habe es schon öfters gelesen und auch versucht es zu googlen, jedoch weiß ich immer noch nicht genau wie udp hole punching funktioniert. Irgendwie tu ich mich in diesem Thema etwas schwer.
UDP hole punching - Wikipedia, the free encyclopedia
Die Theorie lässt sich eigentlich ganz gut begreifen.

Also ich denke mal beim udp hole punching kann ich mir die idee mit den streamsockets abschmicken und muss auf datagrammsockets umsteigen, ist ja auch alles halb so wild.
Naja, da gibt es auch eine TCP Variante, die hat aber nicht so großen Erfolg.

Dabei möchte ich nochmal anmerken, dass die User später das Spiel einfach nur starten müssen ohne irgendwelche vorkehrungen am router oder sonstwo treffen müssen.

Dabei möchte ich nochmal anmerken, dass es nicht klappen wird. Höhstens eben mit dem Zwischenserver, aber das ist keine gute Lösung.
 
Das wäre aber ein enormer Flaschenhals und würde überhaupt nicht skalieren.

Zeig mir einen hier im Forum der im Stande ist ein Spiel zu entwickeln das einen Server mit 100Mbit Netzanbindung vollends auslastet ... 🙂

btw: So Server wie "Teamspeak" vermitteln auch direkt über den TS-Server. Und dennoch haben tausende auf dem Server platz. In meiner Diplomarbeit hab ich Untersuchungen angestellt und bin zum Schluss gekommen, dass ein Server mit 100Mbit locker >=15.000 User bedienen kann (rechnung basiert auf dem Sprechverhalten eines "großen" TS - Servers mit >=4000 Usern). Und bei der Sprachübertragung fallen doch mehr Daten an als bei einem durchschnittlichen Spiel.

- Alex
 
Hm okok...
Im übrigen bin ich gerade 1 jahr vor meinem abitur und bin kein studierender --> blutiger anfänger
Daher habe ich wenig erfahrungen und kenn mich mit servern schlecht aus.

Also ich habe mich jetzt dafür entschieden beim Router Problem dem user diese Möglichkeiten zu bieten:
- Portfreigabe am Router oder
- UPnP am Router aktivieren oder
- einen bereits bestehenden Server beitreten

Das Firewall Problem werde ich mit UDP-Hole-Punching umgehen, wovon ich das Prizip verstanden habe.
Ich weiß das beim UDP-Hole-Punching ein Vermittlerserver benötigt wird, aber da ich mich mit Servern, wie schon gesagt,
nicht auskenne, frage ich mich ob das ein Web-Server sein kann oder etwas anderes.
Muss ich vll ein Servlet schreiben oder nicht?

Kann ich meinen Webspace bei funpic.de (FTP und MySQL wird unterstützt) als Vermittlerserver benutzen?
 
Hm ... stimmt auch wieder...

D.h. da ich persönlich keinen Servertauglichen PC rumstehen hab (der ständig laufen soll) und ich selbst keine kosten für dieses Projekt aufbringen will, fällt UDP-Hole-Punching bei mir flach .. ohne Vermittlerserver.

Das bombermanähnliche Spiel, soll mit dedicated Servern funktioniern. Also ein User eröffnet ein Spiel und fungiert selbst gleichzeitig als Server (Clients treten dem Spiel bei; senden ihre Rohdaten; Server sendet berechnete Daten zurück)

Nun welche möglichkeiten bleiben mir noch, diese Architektur möglichst sauber umzusetzen?
Wo kein UDP-Hole-Punching zwingend erforderlich ist?!
 
btw: So Server wie "Teamspeak" vermitteln auch direkt über den TS-Server. Und dennoch haben tausende auf dem Server platz. In meiner Diplomarbeit hab ich Untersuchungen angestellt und bin zum Schluss gekommen, dass ein Server mit 100Mbit locker >=15.000 User bedienen kann (rechnung basiert auf dem Sprechverhalten eines "großen" TS - Servers mit >=4000 Usern). Und bei der Sprachübertragung fallen doch mehr Daten an als bei einem durchschnittlichen Spiel.

Flaschenhals bleibt Flaschenhals. Kenne mich aber mit Teamspeak nicht aus um in dem Zusammenhang mit sinnvollen Argumenten zu kommen. Skype macht es z.B. auf p2p-basis.

Das bombermanähnliche Spiel, soll mit dedicated Servern funktioniern. Also ein User eröffnet ein Spiel und fungiert selbst gleichzeitig als Server (Clients treten dem Spiel bei; senden ihre Rohdaten; Server sendet berechnete Daten zurück)
Sicher, dass du "dedicated" richtig einsetzt?
Nun welche möglichkeiten bleiben mir noch, diese Architektur möglichst sauber umzusetzen?
Wo kein UDP-Hole-Punching zwingend erforderlich ist?!
Bleiben wir mal realistisch: wieviele Leute werden das Spiel spielen? Dieser überschaubaren Menge kannst du sogar persönlich erklären wie und wo die was einrichten müssen. Mach erstmal ganz normal auf TCP Basis, wenn du alles gut strukturierst wird du es später noch ändern können. Wenn du auf UDP umsteigst, dann stehst du vor anderen Problemen, die dir im Moment noch gar nicht bewusst sind.
 
Flaschenhals bleibt Flaschenhals. Kenne mich aber mit Teamspeak nicht aus um in dem Zusammenhang mit sinnvollen Argumenten zu kommen. Skype macht es z.B. auf p2p-basis.

Naja, kommt halt auf die Betrachtungsweise an. Flaschenhälse gibt es überall. Auch bei P2P. Nix skaliert unendlich gut. Man sollte vorher halt schauen was für anforderungen man hat (z.B. 500 Spieler) und dann schauen welche Lösung das am besten und kostengünstigsten abdeckt.

Aber zurück zum Thema:

Würde bei TCP bleiben. Gerade für Anfänger ist das deutlich einfacher zu benutzen.
Die Sache mit dem Portforwarding: Nun, viele werden sowas wie ne Fritzbox oder nen Speedport haben. Da ist das Portforwarding ein Kinderspiel. Bei den anderen Routern: Es gibt ja Handbücher ...

Alles in allem: Wer einen Server hinter einem Router hosten will, der hat halt das NAT-Problem an der Backe. Ohne Vermittlungsserver (UDP-Hole-Punching oder so wie TS) wirds nicht einfacher/besser.

UPnP Unterstützung kannst du in deinem Programm anbieten, aber mehr auch nicht. UPnP Libs findest du via google. Ganz einfach zu benutzen sind die glaub aber nicht.

- Alex
 
Na gut, ich habe jetzt TCP weiter benutzt, und das Spiel ist im Freundeskreis ein lustiger Zeitvertreib geworden. Das Spiel funktioniert quasi nur im lokalen Netzwerk. (Hamachi wird benutzt).
Das Projekt ist mein Schuleprojekt und wird auf dem Gymmi sicherlich nicht so streng benotet 😛.

Danke für das Posten. :toll:
 

Neue Themen


Zurück
Oben