2012-09-20 13 views
13

Sto tentando di sviluppare un'applicazione TCP/IP del client server. Ho un server in esecuzione sul mio PC e l'app client è in esecuzione sul cellulare. Entrambi si trovano nella stessa rete Wi-Fi, ma non riesco a stabilire una connessione tra di loro. Durante il debug del client Android ha mostrato il seguente errore:Client TCP IP - EHOSTUNREACH (nessuna route per l'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 

Il codice che sto 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(); 
       } 
      } 
     }); 
    } 
} 

Che cosa sto facendo di sbagliato?

+0

sbloccare il firewall sul lato PC, è probabile che la porta è bloccata o ... confermare e verificare che il tuo indirizzo IP privato è nel range 192.168.xy e il DHCP sul wifi è infatti spenderanno la stesso intervallo di indirizzi di rete di 192.168.xy sul tuo dispositivo Android ... – t0mm13b

risposta

13

L'errore di percorso non indica che quando la connessione TCP e ha tentato, la connessione non è riuscita perché il software del protocollo sottostante non riusciva a trovare un nodo di rete per rete di collegamenti nodo al nodo di destinazione designata.

La correzione è in qualche modo dipendente dal sistema operativo ma richiede principalmente di configurare le tabelle di routing in modo che il dispositivo da cui si sta tentando di connettersi sia in grado di capire come raggiungere il dispositivo a cui si desidera connettersi.

Normalmente si specifica un gateway a cui, quando si tenta di connettersi, la richiesta di connessione si spegne il gateway di rete da risolvere da altri dispositivi informatici quali router, ecc

Questo sembra essere un dispositivo Android , quindi la prima cosa è assicurarsi di avere la connettività WiFi o cellulare. Un altro sarebbe quello di assicurarsi che il WiFi o la cella sia acceso e operativo.

L'indirizzo IP specificato è di norma entro un sotto-rete privata. La cosa da verificare è se il dispositivo a cui si sta tentando di connettersi si trova sulla stessa sub-rete su cui è acceso il dispositivo.

Ecco un document on sub-nets and routing.

+1

Dato che questo è Android, la prima cosa che devi controllare sono i permessi. 09-21 01: 08: 40.457: W/System.err (8536): su libcore.io.BlockGuardOs.connect (BlockGuardOs.java:85) indica che la connessione è stata negata dal criterio sul dispositivo. – destenson

6

Questo sembra un problema di rete, non un problema Java. O:

  • la messa in rete sul client o non sa come instradare i pacchetti al server,
  • tentativo di connessione del client sulla porta 4449 è stato bloccato da un filtro firewall o di pacchetti, o
  • stai usando l'indirizzo IP sbagliato.

(Il "No route to host" messaggio suggerisce che è il primo problema, ma i firewall a volte sono configurati per dare risposte fuorvianti al traffico che è indesiderato.)

In ogni caso, si sarebbe meglio alla ricerca di un sito su come configurare e/o reti e routing.

-1

Yep ..

Il padrone di casa non è raggiungibile, proprio così. Tuttavia, se tutto è oK (nodo/rete ben configurato, segnale wifi buono, ..) È possibile forzare il processo utilizzando ping serverIP (dal telefono) o ping smartphone (dal server).

Il ping (i pacchetti ICMP) costringerà il router per velocizzare il nuovo percorso (strada per raggiungere l'host) ...inviare un sacco di ping (opzione -n) ad esempio: ping google.com -n 1000 (1000 ping consecutive)

+0

Effettua il ping nello stesso momento in cui provi a connetterti (app) ... Potresti considerare di fare un telnet al serverPort (per assicurarti che sia aperto) –

+0

Un 'ping' può popolare la tabella ARP locale ma è improbabile che influisce su qualsiasi altra cosa, incluse le tabelle di routing (che sono statiche o configurate con un protocollo come BGP, non dai dispositivi). E poiché bastano pochi ms per eseguire un ARP per ottenere l'indirizzo MAC per un indirizzo IP sulla stessa sottorete locale, non accelererai nulla. –

1

Ciao ho avuto lo stesso problema nel mio mac e l'esecuzione dell'applicazione nel dispositivo Android. Ho dovuto fare dopo 2 cose per farlo funzionare: firewall

  1. Spegnere nel mac
  2. Abilitare il ricevitore a infrarossi (Sistema Pref> Sicurezza> Firewall> Avanzate)

E ha funzionato !

+0

In Il mio sistema il firewall è spento ma continua ad avere lo stesso problema .. –

0

Affronto lo stesso problema quando ho sviluppato un'applicazione Android comunicare con il server desktop java, per risolvere il problema basta scollegare il cavo USB che collega il telefono Android al PC.

+0

la tua risposta non corrisponde nemmeno alla domanda posta ... come può il cavo usb essere un problema per la rete mobile. – Deepak

+0

Non è possibile essere una soluzione, non funzionerà. –

0

scaricare un'applicazione ping sul telefono e provare a eseguire il ping del server ip se è ok ... se si utilizza apache, inserire l'IP della macchina locale nel file di configurazione 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) 
Problemi correlati