2012-04-13 3 views
1

J'ai besoin de construire une application qui peut recevoir des données à partir d'un réseau et utiliser ces données pour faire des choses non pertinentes avec.Sockets en Java ...?

Voici un morceau de code pour clarifier ce que je fais.

Du côté du serveur:

static Socket client = null; 
static ServerSocket ss = null; 

if (ss != null) { 
       ss.close(); 
      } 
      ss = new ServerSocket(5513); 
      isrunning = true; 
      System.out.println("Waiting for client..."); 
      client = ss.accept(); 
      System.out.println("Client accepted."); 
      BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); 

Et du côté client:

Socket client = null; 
PrintWriter out = null; 
        try {        
         client = new Socket("hostname", 5513); 
         out = new PrintWriter(client.getOutputStream(), true); 
    } 

S'il vous plaît noter que ceci est juste un morceau de code. Il n'y a pas d'erreurs dans le code. Après l'exécution du code côté serveur, il attend correctement que le client se connecte.

Maintenant, voici le problème. Dès que j'essaie de me connecter du côté client, j'obtiens un "erreur de connexion ". Cependant, j'ai trouvé quelque chose sur internet whoch m'a dit d'essayer le telnetting côté client. Par exemple, laissez l'adresse IP côté serveur être 192.168.1.1. Donc, après avoir utilisé cette commande:

telnet 192.168.1.1 5513 

J'ai effectivement une connexion avec le serveur. La commande lancera un écran vide, et tout ce que je saisis manuellement dans la ligne de commande sera envoyé au serveur après avoir appuyé sur Entrée (vérifié avec le débogage). Par conséquent, je peux me connecter manuellement au serveur et envoyer des données, mais mon code refuse de se connecter.

Toute personne qui sait ce que je fais mal?

+0

Je ne sais pas exactement pourquoi la vôtre échoue, mais j'ai des sockets fonctionnant facilement en utilisant ces deux tutoriels: http://android-er.blogspot.com/2011/01/implement-simple-socket-server-in. html et http://android-er.blogspot.com/2011/01/simple-communication-using.html – HannahMitt

+0

@HannahMitt, il a oublié une boucle while. Le serveur n'écoute même pas les connexions pendant plus d'une seconde. Une fois que le serveur fait UNE connexion, c'est fini et n'écoutera plus. –

+0

Comme je l'ai dit, ce n'est qu'une partie du code. J'utilise une boucle while, en fait. En outre, la méthode accept() attendra l'établissement d'une connexion pour que je puisse laisser le serveur attendre des heures pour établir la première connexion. Après cela, il bouclera au début pour une autre connexion. –

Répondre

3

Est-ce le code que vous utilisez actuellement?

client = new Socket("hostname", 5513); 

Essayez de changer à:

client = new Socket("192.168.1.1", 5513); 
+0

Cela a fonctionné! Merci. –

0

Vous n'utilisez pas réellement "hostname" dans votre objet Socket dans le client êtes-vous?

Il convient que le 192.168.1.1.

0

Êtes-vous sur Windows? et Si oui avez-vous ajouté java.exe et javaw.exe au pare-feu avec l'entrée et la sortie activées? et avez-vous ajouté une règle pour 5513 à votre pare-feu?

Si oui Windows mais pas de paramètres de pare-feu, c'est votre réponse, ouvrez votre pare-feu.

2

client = new Socket("hostname", 5513); Le nom d'hôte doit représenter l'adresse IP à laquelle vous vous connectez. Si vous essayez de vous connecter à vous-même, ce sera "localhost"

De plus, le serveur n'écoute pas le client À TOUS LES TEMPS, il doit y avoir une boucle while pour que le serveur écoute et accepte les connexions.

while (true) { 
    client = ss.accept(); 
    out = new PrintWriter(client.getOutputStream(), true); 
    //You should probably assign it to a seperate thread to handle stuff for this client 
} 

Et je devrais expliquer pourquoi vous obtenez cette erreur particulière.Lorsque quelque chose indique que la connexion est refusée, cela signifie généralement que l'adresse IP à laquelle vous voulez vous connecter sait que vous avez envoyé une connexion et qu'elle le bloque parce qu'elle n'écoutait pas cette connexion. Fondamentalement, lorsque le serveur a fermé, vous avez arrêté d'écouter le client, donc tout ce qui arrivait sur ce port était bloqué. Bien sûr, l'autre cas pourrait être que Java a été bloqué sur votre pare-feu et une exception devrait être faite pour cela. Bien que ce soit rarement le cas si ce que vous essayez d'accomplir est sur un réseau local.

+0

Ceci est gênant, en remplaçant le nom d'hôte avec l'adresse IP fonctionne réellement. –

+0

La saisie du nom d'hôte fonctionne pour les connexions au réseau local, car j'ai déjà testé ce type de connexion et établi une connexion. Mais pour plus de précision dans vos connexions, je m'en tiendrai aux adresses IP. Sans parler de cette méthode est plus directe et directe. Je n'utiliserais que des noms d'hôtes pour les connexions au site Web. La seule exception est "localhost", ce qui signifie "adresse IP de mon ordinateur" –