2012-01-02 23 views
7

He escrito una aplicación para iniciar mi servidor en casa de forma remota. La aplicación funciona sin problemas en el emulador y también en mi teléfono inteligente (HTC desire, Android 2.2) cuando WiFi está habilitado. Sin embargo, no funciona cuando WiFi está deshabilitado.Programación de socket Android sin conexión WIFi

Antes de reiniciar, primero compruebo si ya se está ejecutando. Para hacer esto, uso conectores y primero me conecto a una dirección dyndns. Después de eso trato de conectarme a mi IP-Box donde puedo encender mi computadora enviando comandos a través de un socket.

Cuando falla la conexión a ese socket, sé que el servidor no se está ejecutando.

El código en cuestión es:

 socket = new Socket(); 
     socket.connect(new InetSocketAddress(serverName, port), 10000); 
      status = socket.isConnected() == true; 
     socket.close(); 

Si hay una excepción (SocketException) Sé que el servidor no se está ejecutando. Este enfoque funciona perfectamente cuando he activado WiFi. Sin embargo, si WiFi no está encendido, la conexión siempre dice que está bien, incluso si no pudo establecer una conexión, ya que el servidor no está disponible.

¿Hay alguna forma de comprobar si la conexión está realmente establecida, incluso si WiFi está deshabilitada?

¡Todas las sugerencias son bienvenidas!

Gracias,

Rudi

+0

¿Cómo sabes que la conexión realmente falló? Incluso si el WiFi está desactivado, una conexión aún puede ocurrir a través de la red de datos móviles. Consulte esto para asegurarse de que la red de datos móviles esté deshabilitada: http://newbiehelper.blogspot.com/2011/07/disabling-mobile-data-network-in.html – Theo

+0

Como el servidor que intento iniciar no se está ejecutando es imposible establecer una conexión. Cuando ejecuto el programa cuando wifi está activado, la llamada a socket.connect() falla como excepción. Debo añadir que acabo de encontrar una pregunta muy similar sobre stackoverflow, desafortunadamente sin respuesta. Básicamente, la otra pregunta se refiere a problemas en el modo 3G, así que obviamente no estoy solo para enfrentar este problema. –

+0

Ok, entonces funciona con WiFi activado, no funciona con Wifi apagado, y esto sucede tanto en el emulador como en el teléfono real. – Theo

Respuesta

2

Intente abrir el zócalo de la siguiente manera:

public boolean connect(String ip, int port) { 
    try { 
     this.clientSocket = new Socket(ip, port); 
     clientSocket.setSoTimeout(timeout); 
     this.outToServer = new DataOutputStream(clientSocket 
       .getOutputStream()); 
     this.inFromServer = clientSocket.getInputStream(); 
     isconnected = true; 
    } catch (IOException e) { 
     Log.e("TCPclient", "connection failed on " + ip + ":" + port); 
     isconnected = false; 
     return isconnected; 
    } 
    Log.e("TCPclient", "connection to " + ip + " sucessfull"); 
    return isconnected; 
} 

Si la conexión no se realiza correctamente, se generará una IOException (trabajo cuando Wi-Fi activado y hay un servidor, y cuando wifi no está habilitado (HTC desire 2.3)).
Este código no es realmente correcto, es sólo una versión corta

EDITAR tratar de comprobar el estado WFI como esto (que no es práctico pero debería funcionar)

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo ni = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
     if (ni.isConnected()) { 
     Toast.makeText(this,"Wifi enabled", Toast.LENGTH_LONG).show(); 
     Log.d("WiFiStateTestActivity", "WiFi!"); 
     } else { 
     Toast.makeText(this,"Wifi not enabled", Toast.LENGTH_LONG).show(); 
     Log.d("WiFiStateTestActivity", "not WiFi!"); 
     } 
    } 
+1

Acabo de probar su código - no hay cambio para mí. Con Wifi habilitado obtengo la excepción, cuando Wifi está desactivado, el socket finge que todo está bien y NO recibo ninguna excepción, incluso si el servidor no se está ejecutando. ¿Qué declaración genera la excepción en tu código? Supongo que es la llamada al constructor, ¿verdad? –

+0

Las excepciones provienen de: this.clientSocket = new Socket (ip, port); W/System.err (2837): java.net.ConnectException: /192.168.0.1:6789 - La red es inalcanzable Mis aplicaciones son una aplicación como la tuya, pero no tengo tu problema, mis aplicaciones se ejecutan en mi HTC désir sin problema y en una tableta Android 2.1 – Duffydake

+0

Para mí, la misma pieza de código falla cuando Wifi está habilitado, así que eso es lo que esperaba. Pero no entiendo por qué obtienes una excepción con wifi deshabilitado y no obtengo una - podría ser la versión de Android, pero como señalé hay otra pregunta con respecto al mismo problema con dos teléfonos inteligentes diferentes y dos Android diferentes versiones, entonces probablemente sea algo diferente. Suspiro - No tengo idea de por qué no funciona. –

1

No se olvide para establecer el permiso en manifest.xml para permitir que la aplicación abra un socket.

Cuestiones relacionadas