2012-09-20 27 views
13

Estoy intentando desarrollar una aplicación TCP/IP del servidor 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. Mientras se depura el cliente aplicación Android mostró el siguiente error:Cliente TCP IP - EHOSTUNREACH (No hay ruta al host)

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 

El código que estoy utilizando:

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?

+0

desbloquear el servidor de seguridad en su lado del PC, es probable que el puerto está bloqueado o ... confirmar y verificar que su dirección IP privada está en el rango 192.168.xy y el DHCP en el wifi es de hecho repartiendo el mismo rango de direcciones de red de 192.168.xy a su dispositivo Android ... – t0mm13b

Respuesta

13

El error de no 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 para la ruta del nodo de red al nodo de destino designado.

La reparación depende en cierto modo del sistema operativo, pero principalmente requiere que configure sus tablas de enrutamiento para que el dispositivo desde el que intenta conectarse pueda averiguar cómo llegar al dispositivo al que desea conectarse.

Normalmente se especifica una puerta de entrada a la cual, cuando se intenta conectar, la solicitud de conexión se va por la puerta de enlace de red para ser resuelta por otros dispositivos de tecnología de la información, tales como routers, etc.

Esto parece ser un dispositivo Android , entonces 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 document on sub-nets and routing.

+1

Dado que esto es Android, lo primero que debe observar son los permisos. 09-21 01: 08: 40.457: W/System.err (8536): en libcore.io.BlockGuardOs.connect (BlockGuardOs.java:85) indica que la conexión ha sido denegada por la política en el dispositivo. – destenson

6

Parece un problema de red, no un problema de Java. O bien:

  • el trabajo en red en el cliente o bien no sabe cómo encaminar los paquetes al servidor,
  • intento de conexión del cliente en el puerto 4449 está siendo bloqueada por un filtro de cortafuegos o paquete, o
  • estás usando la dirección IP incorrecta.

(El "No route to host" mensaje sugiere que es el primer problema, pero los cortafuegos son a veces configurado para dar respuestas engañosas para el tráfico no deseado.)

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

-1

Sip ..

El anfitrión es inalcanzable, así como así. Sin embargo, si todo está en orden (nodo/red bien configurado, buena señal wifi, ...) Puede forzar el proceso usando ping serverIP (desde el teléfono) o 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)

+0

Haga el ping al mismo tiempo que intenta conectarse (aplicación) ... Podría considerar hacer un telnet al puerto del servidor (para asegurarse de que esté abierto) –

+0

Un 'ping' puede llenar la tabla ARP local, pero es poco probable que afecta a cualquier otra cosa, incluidas las tablas de enrutamiento (que son estáticas o están configuradas con un protocolo como BGP, no por dispositivos). Y dado que solo lleva unos pocos meses hacer un ARP para obtener la dirección MAC para una dirección IP en la misma subred local, no va a acelerar nada. –

1

Hola, tuve el mismo problema en mi mac y ejecuté la aplicación en el dispositivo Android. Que tenía que hacer después de 2 cosas para hacer que funcione:

  1. Interruptor cortafuegos apagado en el mac
  2. permitir que el receptor de infrarrojos (Sistema Pref> Seguridad> Firewall> Avanzado)

Y funcionó !

+0

En Mi sistema, el firewall está desactivado, pero sigue teniendo el mismo problema ... –

0

Me encuentro con el mismo problema cuando desarrollé una aplicación de Android para comunicarme con el servidor de escritorio java, para resolver el problema simplemente desconecte el cable USB que conecta el teléfono Android con la PC.

+0

su respuesta ni siquiera coincide con la pregunta ... ¿cómo puede el cable usb ser un problema para la red móvil. – Deepak

+0

Esto no es posible para ser una solución, no funcionará. –

0

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) 
Cuestiones relacionadas