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?
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.
Cela ressemble à un problème de réseau et non à un problème de Java. Non plus:
(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.
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:
Et ça a marché!
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.
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)