2009-12-31 9 views
2

Je crée une application serveur simple et je peux me connecter au réseau local. Mais je ne peux pas me connecter sur Internet.Java: transfert d'un port vers ServerSocket

Ceci est mon code serveur:

ServerSocket server; 
try { 
    server = new ServerSocket(4000); 
} catch(IOException ex) { 
    System.out.printf("Could not bind socket 4000\n"); 
    System.exit(1); 
} 

try { 
    Socket socket = server.accept(); 
    ClientThread client = new ClientThread(socket); 
    client.start(); 
} catch(IOException ex) { 
} 

Et voici le client:

try { 
    System.out.printf("connecting...\n"); 
    Socket socket = new Socket("mydomain.org", 4000); 
    System.out.printf("connected!\n"); 
} catch(UnknownHostException ex) { 
    ex.printStackTrace(); 
} catch(IOException ex) { 
    ex.printStackTrace(); 
} 

J'ai le port 4000 sur mon transmis routeur, qui devrait fonctionner. J'ai renvoyé d'autres ports avant comme 80 et 22.

Lorsque j'exécute le client, j'obtiens la chaîne "connection ...", et elle se bloque là. Je ne reçois pas "connecté!", Ou une trace de pile. Mais comme je l'ai déjà dit, cela fonctionne sur le réseau local. Il fonctionne en se connectant à 127.0.0.1 et en utilisant 192.168.1.90. J'ai utilisé CanYouSeeMe.org pour vérifier si le port était ouvert.Il a réussi sur le port 80, mais il arrive à expiration sur 4000.

+0

Les prises sont bonnes pour le réseau local mais pour la communication internet, il vaut mieux utiliser l'URL, URLConnection ... –

Répondre

2

Vérifiez le port d'adresse IP 4000 lié. Il peut seulement être lié à l'adresse de bouclage (127.0.0.1) au lieu de n'importe quelle interface.

Je ne sais pas que vous utilisez OS, mais pour vérifier: linux: netstat windows et mac -ant: netstat -anp tcp

regard de la ligne sur le port 4000 ECOUTER et voir si elle est liée à toutes les interfaces (*: 4000 ou 0.0.0.0:4000), ou à une interface spécifique (127.0.0.1:4000).

Si ce n'est pas l'écoute sur toutes les interfaces, c'est votre problème - utilisez le constructeur qui vous permet de spécifier l'adresse BindAddress.

+0

J'ai oublié de mentionner que j'utilise Linux; Fedora 12. Ce qui m'a rappelé que je suis probablement possédé par iptables. Je vais désactiver cela pour l'instant et je reviendrai. – jonescb

+0

Essayez une chose à la fois ... essayez de vous connecter à partir d'une autre machine de votre réseau avant de passer à travers le pare-feu. De cette façon, vous pouvez éliminer les problèmes iptables et bindaddress, puis gérer les règles de votre routeur nat et firewall. – Matt

+0

Oui, c'était iptables, je l'ai juste désactivé pendant un moment. Il est vraiment facile d'oublier que Fedora a iptables là et bloque tout. J'ai également dû utiliser un autre constructeur pour lier à l'adresse IP locale (192.168.1.90). Donc, je vais vous marquer comme la solution pour cela et me rappeler involontairement iptables. – jonescb

0

Vous avez effectué les tests pour prouver que ce n'est pas votre Java et doit donc être un pare-feu ou un pare-feu. Même si vous transférez correctement les ports sur votre serveur, le pare-feu du serveur n'autorise peut-être pas les connexions entrantes.

+0

J'ai vérifié mon pare-feu et il permet tous les protocoles sauf NetBIOS. Je ne sais pas quel protocole Java Sockets utilise, mais "Tous les autres protocoles" est coché. – jonescb

0

Vous avez une règle de pare-feu qui rejette les paquets entrants. C'est pourquoi votre client se bloque. Vérifiez les règles IP sur l'ordinateur serveur et sur n'importe quel système de passerelle vers le monde extérieur.

Questions connexes