Java Réseau “Connection Refused: Connect”
J'ai essayé d'obtenir une simple mise en réseau programme de test pour s'exécuter sans résultats.
Serveur:
import java.io.*;
import java.net.*;
public class ServerTest {
public static void main(String[] args) {
final int PORT_NUMBER = 44827;
while(true) {
try {
//Listen on port
ServerSocket serverSock = new ServerSocket(PORT_NUMBER);
System.out.println("Listening...");
//Get connection
Socket clientSock = serverSock.accept();
System.out.println("Connected client");
//Get input
BufferedReader br = new BufferedReader(new InputStreamReader(clientSock.getInputStream()));
System.out.println(br.readLine());
br.close();
serverSock.close();
clientSock.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}
}
Client:
import java.io.*;
import java.net.*;
public class ClientTest {
public static void main(String[] args) throws IOException {
final int PORT_NUMBER = 44827;
final String HOSTNAME = "xx.xx.xx.xx";
//Attempt to connect
try {
Socket sock = new Socket(HOSTNAME, PORT_NUMBER);
PrintWriter out = new PrintWriter(sock.getOutputStream(), true);
//Output
out.println("Test");
out.flush();
out.close();
sock.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}
Le programme fonctionne très bien lorsque j'utilise 127.0.0.1 ou mon IP interne pour le nom d'hôte. Mais à chaque fois que je passe à mon adresse IP externe, il jette un java.net.ConnectException: Connection refused: connect
erreur.
J'ai volontairement choisi une rare port, pour voir si c'était le problème, avec pas de chance.
Je peux me connecter sans problèmes à l'aide de telnet, mais quand j'essaie d'accéder au port avec canyouseeme.org il me dit que la connexion a expiré.
J'ai même essayé de désactiver tous les pare-feu et antivirus, y compris les Windows par défaut et le pare-feu du routeur, avec tous les ports transmis et DMZ activé, et il est dit encore que la connexion a expiré. J'utilise Comcast que mon fournisseur d'accès internet, et je doute qu'ils bloquer un port aléatoire.
Lorsque j'utilise un packet tracer, il montre le trafic TCP avec mon ordinateur qui envoie SYN et la réception RST/ACK, de sorte qu'il ressemble à un port bloqué, et aucun autre paquet suspect de trafic qui se passait.
Je n'ai aucune idée de ce qui se passe à ce point; j'ai bien essayé tous les trucs que je connais. Si quelqu'un sait pourquoi le port peut être bloqué, ou au moins un moyen de faire fonctionner le programme, il serait très utile.
telnet
à le port? Il serait d'aider à localiser le problème. Une autre option à faire est d'essayer de remplacer le processus de serveur avec juste une écoute netcat
et voir si vous pouvez vous connecter à elle.Peut-être que quelqu'un peut me donner un simple client/serveur programme qu'ils savent travaille sur son ordinateur. Qui pourrait m'aider à comprendre si le problème est toujours avec la redirection de port et de pare-feu ou avec mon code.
OriginalL'auteur | 2011-02-10
Vous devez vous connecter pour publier un commentaire.
Pour ce que ça vaut, votre code fonctionne très bien sur mon système.
Je déteste le dire, mais cela ressemble à un problème de firewall (qui je sais que vous avez déjà triple-cochée) ou un Comcast problème, ce qui est plus possible que vous ne le pensez. J'avais test de votre fournisseur de services internet.
OriginalL'auteur mpontillo
Ces problème vient dans les situations suivantes:
Le Client et le Serveur, ou les deux d'entre eux ne sont pas en réseau.
Serveur n'est pas en cours d'exécution.
Serveur est en cours d'exécution mais ne les écoute pas sur le port, le client essaie de se connecter.
Pare-feu n'est pas autorisée pour l'hôte port de la combinaison.
Hôte Port de la combinaison est incorrect.
Protocole Incorrect dans la Connexion de la Chaîne.
Comment résoudre le problème:
D'abord, vous vous de ping du serveur de destination. Si c'est le ping correctement,
ensuite, le client et le serveur sont tous les deux en réseau.
Essayer êtes connecté à un serveur hôte et le port à l'aide de telnet. Si vous êtes
en mesure de se connecter avec elle, alors vous faites quelques erreurs dans le code client.
donc, pour windows, deuxième option qui m'a aidé: telnet {externe-ip} {port} a montré que le serveur n'était pas joignable. quand on les regarde dans les journaux, a constaté que quelqu'un a mis une chaîne vide comme valeur de la propriété intellectuelle. no-ip = pas de connexion.
OriginalL'auteur Nallamachu
Probable que le serveur de socket est uniquement lié à l'adresse localhost. Vous pouvez le lier à une adresse IP spécifique, en utilisant le 3-l'argument de la forme du constructeur.
ServerSocket serverSock = new ServerSocket(PORT_NUMBER, 0, InetAddress.getByName("192.168.1.102"));
, mais pas de dés. Il ne fonctionne toujours pas.Mais 192.168.1.102 n'est pas une adresse externe. C'est votre adresse interne. Je suppose que je suis confus quant à ce qui adresses que vous utilisez.
Je me demande si nous sommes sur la bonne voie ici. Normalement un serveur de socket vont se lier à toutes les interfaces disponibles en tout cas. Je commence à penser que c'est une configuration de mise en réseau question, pas un serveur de socket problème en soi.
OriginalL'auteur Eric Giguere
Je suppose que vous utilisez un Routeur pour se connecter à Internet. Vous devriez faire la Redirection de Port pour laisser l'accès public à votre réseau interne. Jetez un oeil à Comment obtenez-vous Java sockets travailler avec des adresses ip publiques?
J'ai également écrit un billet de blog à propos de la redirection de Port, vous pourriez voulez avoir un coup d'oeil 🙂 http://happycoders.wordpress.com/2010/10/03/how-to-setup-a-web-server-by-yourself/
Mais je ne pouvais toujours pas accessibles sur IP publique, en travaillant sur elle maintenant...
OriginalL'auteur coder9
J'ai eu le même problème, car parfois les clients ont commencé avant de serveur et, quand il a essayé de configurer la connexion, il ne pouvait pas trouver un serveur en cours d'exécution.
Mon premier (pas très élégant) solution était d'arrêter le client pendant un certain temps à l'aide de la méthode sleep:
- Je utiliser ce code juste avant la connexion du client, dans votre exemple, juste avant
Socket sock = new Socket(HOSTNAME, PORT_NUMBER);
Mon deuxième solution était basée sur cette réponse. Fondamentalement, j'ai créé une méthode dans la classe client, cette méthode tente de se connecter au serveur et, si la connexion échoue, il attend deux secondes avant de réessayer.
C'est ma méthode:
Comme vous pouvez le voir, cette méthode tente de créer un socket pour une dizaine de fois, puis renvoie une valeur null pour la prise, donc être prudent et vérifier le résultat.
Votre code doit devenir:
Cette solution m'a aidé, j'espère que cela vous aide. 😉
OriginalL'auteur Ema.jar