web-dev-qa-db-fra.com

Client TCP\IP - EHOSTUNREACH (Aucune route vers l'hôte)

J'essaie de développer une application client serveur TCP/IP. J'ai un serveur en cours d'exécution sur mon PC et l'application client s'exécute sur le mobile. Ils sont tous deux dans le même réseau Wi-Fi, mais je ne peux pas établir de connexion entre eux. Lors du débogage de l'application cliente Android, l'erreur suivante était affichée: 

09-21 01:08:40.422: W/System.err(8536): Java.net.ConnectException: failed to connect to /192.168.15.115 (port 4449): connect failed: EHOSTUNREACH (No route to Host)
09-21 01:08:40.453: W/System.err(8536):     at libcore.io.IoBridge.connect(IoBridge.Java:114)
09-21 01:08:40.453: W/System.err(8536):     at Java.net.PlainSocketImpl.connect(PlainSocketImpl.Java:192)
09-21 01:08:40.453: W/System.err(8536):     at Java.net.PlainSocketImpl.connect(PlainSocketImpl.Java:172)
09-21 01:08:40.453: W/System.err(8536):     at Java.net.Socket.startupSocket(Socket.Java:566)
09-21 01:08:40.453: W/System.err(8536):     at Java.net.Socket.tryAllAddresses(Socket.Java:127)
09-21 01:08:40.453: W/System.err(8536):     at Java.net.Socket.<init>(Socket.Java:177)
09-21 01:08:40.453: W/System.err(8536):     at Java.net.Socket.<init>(Socket.Java:149)
09-21 01:08:40.453: W/System.err(8536):     at sabarish.example.client_mobile.MainActivity$1.onClick(MainActivity.Java:61)
09-21 01:08:40.453: W/System.err(8536):     at Android.view.View.performClick(View.Java:3511)
09-21 01:08:40.453: W/System.err(8536):     at Android.view.View$PerformClick.run(View.Java:14105)
09-21 01:08:40.453: W/System.err(8536):     at Android.os.Handler.handleCallback(Handler.Java:605)
09-21 01:08:40.453: W/System.err(8536):     at Android.os.Handler.dispatchMessage(Handler.Java:92)
09-21 01:08:40.453: W/System.err(8536):     at Android.os.Looper.loop(Looper.Java:137)
09-21 01:08:40.453: W/System.err(8536):     at Android.app.ActivityThread.main(ActivityThread.Java:4424)
09-21 01:08:40.453: W/System.err(8536):     at Java.lang.reflect.Method.invokeNative(Native Method)
09-21 01:08:40.453: W/System.err(8536):     at Java.lang.reflect.Method.invoke(Method.Java:511)
09-21 01:08:40.453: W/System.err(8536):     at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:784)
09-21 01:08:40.453: W/System.err(8536):     at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:551)
09-21 01:08:40.453: W/System.err(8536):     at dalvik.system.NativeStart.main(Native Method)
09-21 01:08:40.457: W/System.err(8536): Caused by: libcore.io.ErrnoException: connect failed: EHOSTUNREACH (No route to Host)
09-21 01:08:40.457: W/System.err(8536):     at libcore.io.Posix.connect(Native Method)
09-21 01:08:40.457: W/System.err(8536):     at libcore.io.BlockGuardOs.connect(BlockGuardOs.Java:85)
09-21 01:08:40.457: W/System.err(8536):     at libcore.io.IoBridge.connectErrno(IoBridge.Java:127)
09-21 01:08:40.457: W/System.err(8536):     at libcore.io.IoBridge.connect(IoBridge.Java:112)
09-21 01:08:40.457: W/System.err(8536):     ... 18 more

Le code que j'utilise:

public class MainActivity extends Activity {
    private Socket client;
    private PrintWriter printwriter;
    private EditText textField;
    private Button button;
    private String messsage;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textField = (EditText) findViewById(R.id.editText1); //reference to the text field
        button = (Button) findViewById(R.id.button1); //reference to the send button

        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                messsage = textField.getText().toString(); //get the text message on the text field
                textField.setText("");      //Reset the text field to blank

                try {
                    client = new Socket("192.168.15.115", 4449);  //connect to server
                    printwriter = new PrintWriter(client.getOutputStream(),true);
                    printwriter.write(messsage);  //write the message to output stream

                    printwriter.flush();
                    printwriter.close();
                    client.close();   //closing the connection

                } catch (UnknownHostException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }); 
    }
}

Qu'est-ce que je fais mal?

15
sash

L'erreur d'absence de route indique que, lorsque la connexion TCP a été tentée, la connexion a échoué car le logiciel de protocole sous-jacent n'a pas pu trouver un nœud de réseau vers un nœud de réseau menant au nœud cible désigné.

Le correctif dépend un peu du système d'exploitation, mais vous devez principalement configurer vos tables de routage afin que le périphérique auquel vous essayez de vous connecter puisse déterminer comment atteindre le périphérique auquel vous souhaitez vous connecter.

Normalement, vous spécifiez une passerelle à laquelle, lorsque vous essayez de vous connecter, la demande de connexion sort de la passerelle réseau pour être résolue par d'autres périphériques informatiques tels que des routeurs, etc.

Cela ressemble à un appareil Android, la première chose à faire est donc de vous assurer que vous avez la connectivité, qu'elle soit WiFi ou cellulaire. Une autre solution serait de s'assurer que le WiFi ou la cellule est activé et opérationnel.

L'adresse IP que vous spécifiez se trouve normalement dans un sous-réseau privé. Il convient donc de vérifier si le périphérique auquel vous essayez de vous connecter se trouve sur le même sous-réseau que votre périphérique.

Voici un document sur les sous-réseaux et le routage .

Citation d'un commentaire sur Android par l'utilisateur destenson

Un commentaire de l'utilisateur destenson du 13 mai 2017 ajoute ces informations supplémentaires spécifiques à Android et les messages d'erreur fournis dans le message.

Comme il s'agit d'Android, la première chose à considérer est autorisations. 09-21 01: 08: 40.457: W/System.err (8536): à libcore.io.BlockGuardOs.connect (BlockGuardOs.Java:85) indique que la connexion a été refusée par la stratégie sur le périphérique.

16
Richard Chambers

Cela ressemble à un problème de réseau et non à un problème de Java. Non plus:

  • la mise en réseau sur le client ne sait pas non plus comment router les paquets vers le serveur, 
  • la tentative de connexion du client sur le port 4449 est bloquée par un pare-feu ou un filtre de paquets, ou
  • vous utilisez la mauvaise adresse IP.

(Le message "Aucune route vers l'hôte" suggère qu'il s'agit du premier problème, mais les pare-feu sont parfois configurés pour donner des réponses trompeuses au trafic indésirable.)

Quoi qu'il en soit, vous feriez mieux de chercher un site sur la configuration et/ou les réseaux et le routage. 

6
Stephen C

Bonjour, j'ai eu le même problème dans mon mac et l'exécution de l'application dans un appareil Android. Je devais faire 2 choses pour que ça marche:

  1. Désactiver le pare-feu dans le Mac 
  2. Activer le récepteur infrarouge (Configuration système> Sécurité> Pare-feu> Avancé)

Et ça a marché!

2
trial999

Je rencontre le même problème lorsque j'ai développé une application Android pour communiquer avec le serveur de bureau Java. Pour résoudre le problème, il suffit de débrancher le câble USB qui connecte le téléphone Android au PC.

1
Kanaan El Bhissy

téléchargez une application de ping sur votre téléphone et essayez de cingler l'adresse IP du serveur si elle est correcte .... si vous utilisez Apache, insérez l'adresse IP de la machine locale dans le fichier de configuration httpd.conf.

# Change this to Listen on specific IP addresses as shown below to 
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 127.0.0.1:80
Listen 192.168.1.30:80  (your IP)
0
Emerson Jones