2012-04-10 12 views
1

Hallo Ich mache ein Java-Multiplayer-Spiel und alles funktioniert gut. Es hat alles, was jemand brauchen würde, aber ich fand ein Problem, es verwendet ServerSocket für Server und Socket für Clients, funktioniert gut, aber das große Problem ist, dass es nicht weltweit funktioniert. Nur LAN, ich habe sogar Hamachi ausprobiert, aber das hat auch nicht funktioniert.Java Sockets funktionieren über LAN, aber nicht über das Internet?

Haben Sie irgendwelche Ideen, was funktionieren würde?

Weitere Informationen: Ich verwende einen bestimmten Thread im Server für das Akzeptieren, Senden und Empfangen von Sockets und auch bestimmte Thread in Client zum Senden und Empfangen. Es sendet ein Objekt, das ich gemacht habe und enthält alle Informationen.

ip = InetAddress.getLocalHost().getHostAddress() + ":" + port; 

server = new ServerSocket(); 

//This asks you if you want to use a specific IP or just the one that we got in first line 
String socketaddress; 
socketaddress = (String) JOptionPane.showInputDialog(null, "IP: ", "Info",JOptionPane.INFORMATION_MESSAGE,null,null,InetAddress.getLocalHost().getHostAddress()); 
server.bind(new InetSocketAddress(socketaddress, port)); 

//Here it starts the accept thread, and then it starts send and receive threads 
new Thread(accept).start(); 

ist hier Material von Client, die ich am wichtigsten finden:

socket = new Socket(ip,port); 

String set_username = System.getProperty("user.name"); 
set_username = (String) JOptionPane.showInputDialog(null, "Username: ", "Info", JOptionPane.INFORMATION_MESSAGE,null,null,set_username); 
username = set_username; 

//It sends the username to server 
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); 
oos.writeObject(username); 

//Then server responds with a message 
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); 
String response = (String) ois.readObject(); 

//This writes the server' message 
JOptionPane.showMessageDialog(null, response, "Message",JOptionPane.INFORMATION_MESSAGE); 

Auch habe ich ein anderes Problem, die Sockel nehmen wie 3 oder 4 Sekunden von 1 Client zum anderen zu gelangen, und es sollte sein fast augenblicklich, weil es im selben Netzwerk ist und ich ein schnelles Internet habe.

EDIT: Ich habe versucht, einen Server auf demselben PC mit Client erstellen und dann bei der Verwendung meiner globalen IP-Verbindung, es hat nicht funktioniert :(

EDIT: seine Arbeits IM SO GLÜCKLICH IM AUGENBLICK allem hatte ich ZU TUN IST HINZUFÜGEN PORTS IN FIREWALL DANKE SO VIEL GUYS: D. Jetzt kann ich mit meinen Freunden spielen: 3

+0

Was meinst du, es funktioniert nicht weltweit? Sind Sie sicher, dass Sie _port forwarding_ korrekt eingerichtet haben? – scientiaesthete

+0

Ja, absolut sicher, und Firewall auch. – IvanDonat

+0

Und ein Benutzer im Internet kann Telnet zu einem Dienst auf Ihrem Computer nur mit dem Hostnamen/IP-und Port-Nummer? –

Antwort

6

Wenn Sie eine Verbindung zu einem Java-Web-Server im Internet wird es ServerSocket und Socket verwenden.Dies funktioniert nur

Was wahrscheinlich nicht funktioniert ist, dass Benutzer im Internet keine Verbindung zu Ihnen herstellen können weil du hinter einer Firewall oder einem Router/NAT bist (nichts mit Java zu tun). Bis ein Benutzer im Internet über die IP-Adresse zu einem Port auf Ihrem Computer telnet kann, funktioniert die Verwendung von Java nicht anders.

BTW: Sie sollten immer Ihre ObjectOutputStream AND Flush() vor dem Erstellen der ObjectInputStream erstellen andernfalls der ObjectInputStream am anderen Ende für immer blockieren kann.

+2

Hallo - wie Peter Lawrey schon sagte, hat Ihre Frage wahrscheinlich wenig mit Java zu tun, und alles hat mit der Netzwerkkonfiguration zu tun. Bitte lesen Sie auf Firewalls, NATs, etc. Bitte beachten Sie auch eine Kopie von "wireshark": http://www.wireshark.org. – paulsm4

+0

Wohin mit Flush()? – IvanDonat

+0

"flush() vor dem Erstellen des ObjectInputStream";) –

3

Sie müssen sich auf firewalls lesen (die kontrolliert, was von außerhalb des LAN in eine Maschine zu verbinden erlaubt ist), port forwarding (die öffentlichen IP-Adressen zu internen IP-Adressen weiterleiten kann) und IP addressing im Allgemeinen (was geben Sie erfahren, wie IP-Adressen funktionieren, was öffentlich/privat ist und wie Daten über Netzwerke übertragen werden.

Von dort wäre es sehr hilfreich sein, wenn in Zukunft Fragen, dann werden Sie schreiben, welche IP-Adressen, die Sie sich verbinden von und zu (öffentlich oder auf andere Weise), was für Fehlermeldungen auftreten, werden (nicht nur der Code) und was Sie bereits versucht haben und bei dem Sie versagt haben. Die Q/A im Stackoverflow ist nicht als Fehlersuche gedacht - wir brauchen wirklich spezifische Fehlermeldungen, wie Ihre Portweiterleitung konfiguriert ist, welche Firewall (en) vorhanden sind, und welche Dinge Sie ausprobiert haben. Derzeit gibt es viele potenzielle Probleme mit weltweitem Spiel angesichts des Codes, den Sie gepostet haben (obwohl der Code möglicherweise nicht das eigentliche Problem ist - es ist wahrscheinlich eher ein Konfigurationsproblem).

Ich sage grundsätzlich, dass dies eine unglaublich breite Antwort ist, aber Ihre Frage ist auch unglaublich breit und beinhaltet kein klares Problem.

+0

Der Fehler, den ich bekomme, war: Timeout der Verbindung (auf dem Client). – IvanDonat

+0

Ok, aber das heißt, die Verbindung hat nicht funktioniert - was wir wissen. Der Grund dafür könnte ** überall ** in Ihrer Firewall/Port-Weiterleitungskonfiguration sein und könnte auf der Client- und/oder Server-Seite liegen, könnten alle Clients oder nur einige Clients sein usw. Leider ist es nicht genug, um solche zu geben eine breite Fehlermeldung. Sie müssen durch Ihre Konfiguration gehen, jeden Schritt der Verbindung auf dem Weg testen, herausfinden, bei welchem ​​Schritt ** die Verbindung fehlschlägt, und mit einer viel spezifischeren Frage von diesem Punkt aus beginnen, mit den zugehörigen Protokollen, Fehlern und Konfigurationsdetails. – jefflunt

+0

Okay, ich erlaubte Ports auf Firewall, ingoing und ausgehend und Port weitergeleitet (wieder) jetzt werde ich das Spiel normal und über Hamachi testen :) – IvanDonat

0

Sie benötigen eine statische IP-Adresse von Ihrem ISP, und Sie müssen den Port in Ihrem Router weiterleiten, um auf die LAN-IP des Servers zu verweisen, den Sie verwenden. 192.168.1.xxx Hinweis: Einige ISPs bieten Geschäftskunden nur statische IP-Adressen. Erkundigen Sie sich bei Ihrem ISP. Stellen Sie außerdem sicher, dass die Firewall auf dem Computer, den Sie als Server verwenden, über den von Ihnen verwendeten Port verfügt. Ich bin sicher, du wusstest das, weil du gesagt hast, dass es im LAN funktioniert. aber ich dachte, ich würde es für diejenigen, die dies lesen, die Schwierigkeiten haben, über LAN und WAN verbinden erwähnen.