Cliente TCP \ IP – EHOSTUNREACH (Sin ruta al host)

Estoy tratando de desarrollar una aplicación TCP / IP de servidor de cliente. Tengo un servidor ejecutándose en mi PC y la aplicación cliente se está ejecutando en el móvil. Ambos están en la misma red Wi-Fi, pero no puedo establecer una conexión entre ellos. Al depurar la aplicación de Android del cliente, se muestra el siguiente error:

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.(Socket.java:177) 09-21 01:08:40.453: W/System.err(8536): at java.net.Socket.(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 

El código que estoy usando:

 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é estoy haciendo mal?

El error sin ruta indica que cuando se intentó la conexión TCP, la conexión falló debido a que el software de protocolo subyacente no pudo encontrar un nodo de red a la ruta del nodo de red al nodo objective designado.

La solución es un tanto dependiente del sistema operativo, pero principalmente requiere que configure sus tablas de enrutamiento para que el dispositivo desde el que intenta conectarse pueda descubrir cómo llegar al dispositivo al que desea conectarse.

Normalmente, usted especifica una puerta de enlace a la cual, cuando intenta conectarse, la solicitud de conexión sale de la puerta de enlace de la red para ser resuelta por otros dispositivos de tecnología de la información tales como enrutadores, etc.

Parece ser un dispositivo Android, así que lo primero es asegurarse de que tenga conectividad ya sea WiFi o celular. Otra sería asegurarse de que el WiFi o la célula estén encendidos y operativos.

La dirección IP que especifique normalmente se encuentra dentro de una subred privada. Lo que hay que verificar es si el dispositivo al que está intentando conectarse está en la misma subred en la que se encuentra su dispositivo.

Aquí hay un documento sobre subredes y enrutamiento .

Esto parece un problema de red, no un problema de Java. Ya sea:

  • la red en el cliente no sabe cómo enrutar los paquetes al servidor,
  • el bash de conexión del cliente en el puerto 4449 está siendo bloqueado por un firewall o filtro de paquete, o
  • estás usando la dirección IP incorrecta.

(El mensaje “No hay ruta al host” sugiere que es el primer problema, pero a veces los firewall están configurados para dar respuestas engañosas al tráfico que no es deseado).

De todos modos, sería mejor buscar un sitio sobre cómo configurar y / o redes y enrutamiento.

Hola, tuve el mismo problema en mi Mac y ejecuté la aplicación en un dispositivo Android. Tenía que hacer dos cosas para que funcione:

  1. Apague el firewall en el mac
  2. Habilite el receptor de infrarrojos (Sistema Pref> Seguridad> Cortafuegos> Avanzado)

¡Y funcionó!

Me enfrento al mismo problema cuando desarrollé una aplicación Android comunícate con el servidor de escritorio java, para resolver el problema simplemente desconecta el cable usb que conecta el teléfono Android con la PC.

descargue una aplicación de ping en su teléfono e intente hacer ping al servidor ip si está bien … si usa apache ponga la IP de la máquina local en el archivo de configuración 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) 

Sí..

El anfitrión es inalcanzable, así como así. Sin embargo, si todo está bien (nodo / red bien configurado, buena señal wifi, …) Puede forzar el proceso utilizando el ping serverIP (desde el teléfono) o el ping smartphone (desde el servidor).

El ping (paquetes ICMP) obligará al enrutador a acelerar el nuevo enrutamiento (forma de llegar al host) … enviará muchos pings (-n opción), por ejemplo: ping google.com -n 1000 (1000 pings consecutivos)