2010-12-05 14 views
9

Android noob aquí. Aprendo lo mejor al ver el código fuente de un ejemplo funcional, pero no he podido encontrar un ejemplo simple pero completo de usar un socket en su propio hilo.¿Cómo obtener datos hacia/desde un socket en un hilo?

Tengo un servicio de Android que necesita para comunicarse con Internet. Quiero abrir un socket TCP que se conecta a un servidor en Internet. El servicio debe enviar datos a Internet y los datos que regresen de la red deberán dirigirse al servicio. Como el servicio también está haciendo otras cosas, la conexión de socket necesita vivir en su propio hilo.

¿Alguna idea de dónde podría encontrar un ejemplo de un socket en un hilo con comunicación hacia/desde el socket?

Gracias

enter image description here

Respuesta

15

sólo hay que crea una tarea asíncrona que se comunica en segundo plano y luego actualiza el subproceso de interfaz de usuario según sea necesario. Aquí está el subproceso de fondo para obtener información de un zócalo y actualizar una vista de texto con el número de bytes que los receptores

public class InternetTask extends AsyncTask<Void, Integer, Void> { 

    private WeakReference<TextView> mUpdateView; 

    public LoginTask(TextView view) { 
     this.mUpdateView = new WeakReference<TextView>(view); 
    } 

    @Override 
    protected Void doInBackground() { 

     try { 
      Socket socket = new Socket("127.0.0.1", 80); 
        InputStream is = socket.getInputStream(); 

        byte[] buffer = new byte[25]; 
        int read = is.read(buffer); 
        while(read != -1){ 
         publishProgress(read); 
         read = is.read(buffer); 
        } 

        is.close(); 
        socket.close(); 



     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     if(mUpdateView.get() != null && values.length > 0){ 
        mUpdateView.get().setText(values[0].toString()); 
       } 
    } 

} 

Y aquí es cómo se patada ese hilo fuera

public class TestTab extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.someLayout); 

      TextView textView = (TextView)findViewById(R.id.someid); 
      InternetTask task = new InternetTask(textView); 
      task.execute(); 

    } 
} 
+0

¿Hay alguna Cómo enviar datos adicionales a AsyncTask una vez que se ha iniciado para que los datos puedan enviarse a través del socket? Veo cómo usar publishProgress y onProgressUpdate para obtener datos del hilo de fondo al hilo de UI, pero no veo cómo ir hacia otro lado mientras se está ejecutando la tarea. –

+2

Puede definir cualquier otro método en su tarea asincrónica que desee. Simplemente sepa que el método doInBackground() será el único ejecutado en un hilo separado. También puede pasar los datos que desea enviar en el constructor o al método execute(). –

+0

Cuando abro un socket en doInBackground(), ese nuevo hilo va a estar bloqueando hasta que los datos entren en el socket. Cuando entran los datos, puedo enviarlos al hilo de UI a través de publishProgress. Dado que el socket se creó en ese hilo de trabajo, ¿cómo enviaría datos al socket desde el hilo de UI? Estoy tratando con un flujo de datos, por lo que enviar parámetros con el comando execute() es bueno, pero necesito enviar datos continuamente al socket. –

8

Aquí es mucho blog sobre este tema, donde tanto el servidor y el cliente están mostrando partes, con la comunicación toma de pasarse de un hilo separado.

http://thinkandroid.wordpress.com/2010/03/27/incorporating-socket-programming-into-your-applications/

Una cosa a tener en cuenta es que si usted está pasando int s usted puede funcionar en un problema de orden de bytes, por lo que, simplemente hacer algunas pruebas y sugeriría a asegurarse de que el servidor envía en el formato que el Android necesita, en caso de que tenga servidores en más de un sistema operativo.

Para una manera sencilla, en el Android para encontrar el orden de bytes puede utilizar esto: http://developer.android.com/reference/java/nio/ByteOrder.html

Según este artículo, el orden de bytes se pueden intercambiar para la optimización: http://en.wikipedia.org/wiki/Dalvik_(software)

+0

Esa es la más clara código que he visto que muestra cómo crear sockets. Sin embargo, aunque el ejemplo del servidor muestra cómo enviar datos de vuelta al subproceso de la interfaz de usuario (a través del controlador), ninguno de los ejemplos muestra cómo mover los datos del subproceso de la interfaz de usuario al subproceso del socket. –

+0

Puede usar View.post para volver al hilo de la interfaz de usuario, pero esta página puede ayudarlo de otras maneras: http://developer.android.com/guide/appendix/faq/commontasks.html#threading –

Cuestiones relacionadas