2010-01-16 18 views
5

Ich habe ein kleines Chat-Programm erstellt, das einwandfrei funktioniert, wenn der Client & Server auf demselben Computer (und wahrscheinlich auch Netzwerk) ausgeführt wird. Sobald ich jedoch versuche, über das Internet eine Verbindung zu einem anderen Computer herzustellen, wird die Socketverbindung einfach abgemeldet. Liegt das an Firewalls/Routern usw.?Java Sockets und das Internet

Und wie kann ich einen ServerSocket & Socket über das Internet verbinden?

Antwort

4

Sobald ich jedoch versuche, eine Verbindung zu einem anderen Computer über das Internet herzustellen, wird die Socketverbindung einfach ablaufen. Liegt das an Firewalls/Routern usw.?

Ja, sehr wahrscheinlich. Sie stoßen auf das Problem NAT: Im Wesentlichen die gleiche extern sichtbare IP-Adresse zu viele intern sichtbare Endpunkte zugeordnet, und externe Endpunkt nicht wissen, welchen internen Endpunkt Ihre Socket-Anfrage zu geben.

Der einfachste Weg ist haben beide Ihre Kunden Verbindung zu einer dritten Partei, die beide sehen können, und dann haben die dritte Partei die Kommunikation zu vermitteln. So arbeiten beispielsweise die meisten Instant-Messaging-Protokolle.

Wenn Sie keine Möglichkeit haben, eine Drittanbieter-Entität so zu steuern, besteht eine Alternative zur direkten Verbindung zweier Clients darin, dass beide Clients einen vereinbarten Port öffnen und dann die Kommunikation auf diesem Port mit ihrer eigenen internen Schnittstelle abbilden Endpunkt. Dies stellt die fehlende Verbindung bereit, die der extern sichtbare Endpunkt (z. B. Ihr Heim-Router) benötigt, um die Kommunikation an das beabsichtigte Ziel zu liefern.

+0

Ja, aber ich fürchte, ich habe keine solche dritte Partei ... – Jake

+0

@Jake: Ich vermutete, dass das der Fall sein könnte - siehe meinen letzten Absatz. Grundsätzlich sollte Ihr Chat-Programm einen beliebigen Port verwenden (wenn dies IPv4 ist, wählen Sie eine Nummer über 1024, da diese reserviert sind) und erfordern, dass beide Clients diesen Port auf ihren Routern geöffnet haben. –

+1

@JohnFeminella Hallo John, kannst du mir ein Beispiel geben oder mir zeigen, wie ich dieses "Drittanbieter" -Modul schreiben kann, mit dem sich beide Clients verbinden können? – asloob

0

Zuerst testen, ob es wirklich in einem LAN funktioniert; Es hört sich so an, als würden Sie einfach davon ausgehen.

Wenn es in Ihrem lokalen Netzwerk funktioniert, schlägt es möglicherweise fehl, da der Server keine öffentliche IP hat und hinter einem NAT-Router ausgeführt wird.

+0

Woher weiß ich, dass meinem Server eine öffentliche IP fehlt?Sowohl mein Laptop als auch mein iPod zeigen die selbe IP auf whatismyip.com, bedeutet das, dass mein Server (Laptop) keine öffentliche IP hat? – Jake

1

Wenn sich Ihr Server hinter einer NAT-Router-Box befindet (und die meisten Heimcomputer sind, insbesondere wenn Sie WiFi verwenden), ist er nicht von außen erreichbar, es sei denn, Sie richten Ihren Router so ein, dass er auf diesen Server weiterleitet.

Wie lautet die IP Ihres Servercomputers? Wenn es 192.168.x.x oder 10.x.x.x ist, dann ist es eine nicht routingfähige Adresse und kann nicht von außen erreicht werden.

+0

Aber wie können Server aus der ganzen Welt (MSN, ICQ, Mail usw.) meinen Computer kontaktieren? – Jake

+0

Nun, das lokale Netzwerk IP (etw. 192.168.xxx) unterscheidet sich von der Internet-IP (etw. Sonst, mit whatismyip.com überprüft), aber die öffentlichen IPs sind auf meinem iPod und Laptop identisch .... – Jake

+0

Es ist Ihr Computer verbindet sich nicht mit ihnen. Sie können eine Verbindung zu einem beliebigen Knoten mit einer öffentlichen IP-Adresse herstellen. Wenn sich der Server hinter einem NAT befindet, kann der NAT-Rounder so konfiguriert werden, dass er Verbindungen umleitet, aber das ist eine Superuser-Frage – notnoop

1

Angenommen, mit dem Ausführen auf dem gleichen Computer meinen Sie, dass Sie dem Client sagen, der Server ist 127.0.0.1/localhost, sollte es kein Problem in Ihrem Code aber wegen Firewalls oder Router sein. Wenn sich Ihr Server hinter einem Router befindet, der Masquerading ausführt (dh der Server hat keine öffentliche, sondern eine private IP-Adresse wie 192.168.xy zum Beispiel), müssen Sie den Router so konfigurieren, dass er eine Verbindung vom Internet an den Computer mit dem Server gibt Server.

Ein anderer Grund, warum es nicht funktioniert, könnte die Art sein, wie Sie Ihren Server an die Schnittstelle binden. Wenn Sie dort 127.0.0.1 angeben, wird der Server nur auf Anforderungen warten, die vom selben System kommen. Wenn Sie keine Adresse angeben, werden alle Schnittstellen überwacht.

Bearbeiten Ihr Kommentar zeigt an, dass Sie tatsächlich das NAT-Problem haben, wie andere sagten. Konfigurieren Sie Ihren Router entsprechend ist wahrscheinlich die einfachste Lösung.