Socket Connection Timeout en el teléfono Android

Estoy tratando de hacer algunos servidor / socket de programación. El código del servidor está escrito en Java normal en una máquina Ubuntu. El código del cliente está escrito para mi LG Thrill. El servidor parece funcionar bien. He probado el servidor escribiendo un cliente de prueba simple en Java llano que básicamente utiliza el bloque try / catch con ip de "localhost". Comprobé si el IP era accesible por ssh'ing en la máquina del servidor desde mi teléfono (sí, es accesible).

Mi código de servidor se ve así:

package org.vsector.server; import java.io.IOException; import java.net.ServerSocket; public class SceneFlowServer { int port; Thread running = null; CameraHandler handler = null; public SceneFlowServer( int port, CameraHandler handler ){ this.port = port; this.handler = handler; } public void start(){ if( handler == null ) return; try{ running = new Thread(){ public void run(){ try{ ServerSocket listen = new ServerSocket( port ); while( true ){ System.out.print( "I am waiting on port " + port + "... " ); handler.accept( listen.accept() ); System.out.println( "Got someone!" ); Thread spinoff = new Thread( handler ); spinoff.start(); } }catch( IOException e ){ System.err.println( "Could not listen on port " + port + "!" ); System.err.flush(); return; } } }; running.start(); running.join(); }catch( Exception e ){ System.err.println( "Could not start thread!" ); System.err.flush(); } } } 

Mi CameraHandler código:

 package org.vsector.server; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; public class CameraHandler implements Runnable { Socket client = null; public CameraHandler(){ } public void accept( Socket client ){ this.client = client; } @Override public void run() { // TODO Auto-generated method stub BufferedReader in; try { in = new BufferedReader( new InputStreamReader( client.getInputStream() )); System.out.println( in.readLine() ); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { client.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 

Mi código de cliente se ve así:

 package org.vsector.client; import java.io.PrintWriter; import java.net.InetSocketAddress; import java.net.Socket; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class ProcessingClientActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView text = (TextView) findViewById( R.id.textBox ); Socket sock; try { text.append( "\nOpening and writing to socket... " ); sock = new Socket(); sock.connect( new InetSocketAddress( "some ip", 4444 ), 30000 ); PrintWriter out = new PrintWriter( sock.getOutputStream(), true ); out.println( "Hello!" ); out.close(); sock.close(); text.append( "Done!" ); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); text.append( "Error: " + e + "\n" ); text.append( e.getMessage() ); } } } 

El permiso se establece, pero esto aún resulta en "Error: java.net.SocketTimeoutException: Tiempo de espera de conexión."

¡No puedo imaginar qué lo causa! ¿Algunas ideas?

Editar:

No importa. Problema de red. Corrí el código en mi red doméstica y todo funciona bien.

Dude, intenta agregar flush () entre ellos:

 out.println( "Hello!" ); out.flush(); //add this line out.close(); 

Your'e que cierra el zócalo para ayunar quizá ..

No hay ningún problema real con el código, pero todo con la red en la que estaba.

Después de que me trasladé a mi red doméstica, todo funciona.

  • Acceda a la impresora a través de Wifi desde el dispositivo Android
  • ¿Cómo puede mi aplicación Android comunicarse con un daemon nativo?
  • ¿Cómo ejecutar el servicio no en el hilo principal?
  • Comunicación de socket cliente / servidor de Android mediante Service o IntentService
  • Envío de datos TCP desde Android (como cliente) - ¿no se envían datos?
  • ObjectInputStream - ¿Cómo esperar a nuevos datos?
  • Comunicación con Java socket de Android con Socket.IO
  • Reenvío de puertos Android
  • Cómo resolver java.net.BindException: error de enlace: EADDRINUSE (Dirección ya en uso)
  • Escucha un shoutcast con Android
  • Sockets, Threads y Servicios en android, ¿cómo hacerlos trabajar juntos?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.