¿Hay algún mecanismo de devolución de llamada en android cuando hay datos disponibles para leer en socket

Bueno, estoy familiarizado con la programación de socket en c, entorno iOS. Pero ahora tratando de conectar mi android y mi servidor remoto a través de sockets … Como un arranque, escribí un programa de servidor simple en C y lo corrió en mi escritorio que Esperar pacientemente por una solicitud de conexión, acepta la conexión, a continuación, esperar a que una cadena de solicitud, y en la obtención de la cadena de solicitud devuelve una cadena de respuesta, a continuación, espere a la siguiente solicitud y seguir .. Bueno, tienes la idea ..

Hasta aquí

  1. He establecido una conexión con mi Android y servidor
  2. Datos enviados y recibidos

Y este es mi código de cliente ..

public class SocketMaster { private Socket clientSocket = null; BufferedReader socketReadStream = null; public boolean connectToHost(String ip, int port){ try { InetAddress serverAddr = InetAddress.getByName(ip); try { clientSocket = new Socket(serverAddr, port); socketReadStream = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); String line = null; String stringToSend = "This is from client ...Are you there???"; //Write to server..stringToSend is the request string.. this.writeToServer(stringToSend); //Now read the response.. while((line = socketReadStream.readLine()) != null){ Log.d("Message", line); } } catch (IOException e) { e.printStackTrace(); return false; } } catch (UnknownHostException e) { e.printStackTrace(); return false; } return true; } public boolean writeToServer(String stringToSend){ DataOutputStream dos = null; try { dos = new DataOutputStream(clientSocket.getOutputStream()); } catch (IOException e) { e.printStackTrace(); return false; } try { dos.write(stringToSend.getBytes()); } catch (IOException e) { e.printStackTrace(); return false; } return true; } } 

Creo un objeto de SocketMaster de otra actividad y llamadas connectToHost que pasa el IP y el puerto del servidor … Todo funciona bien y puedo conectar, enviar y recibir datos ..

Ahora mi pregunta es acerca de estas líneas

 //Now read the response.. while((line = socketReadStream.readLine()) != null){ Log.d("Message", line); } 

Por lo que entiendo, el hilo que ejecuta este código

  • Hasta que haya datos para leer
  • Si los datos disponibles, leerlo, entonces debido a los bloques de bucle de nuevo hasta el próximo fragmento de datos llega

Simplemente no puedo ejecutar este código en el hilo principal, ya que bloqueará mi UI Actividades .. Puedo pensar en ejecutar esto en un hilo de fondo, que es una opción …

Pero Idealmente lo que quiero es …

Una llamada de vuelta (creo, oyente en términos android, cualquier persona familiarizada con iOS CFSocket y callback ), método, que se llama cuando hay datos disponibles para leer, por lo que sólo puedo leer los datos y luego volver ..

¿Existe algún mecanismo de este tipo en android / java … Si no (:-(), ¿alguien puede vincularme a algún ejemplo donde la gestión de socket se realiza en segundo plano …

EDIT: Yo no estaba preguntando acerca de la creación de un mecanismo de devolución de llamada yo mismo .. Sólo estaba preguntando ¿hay algún oyente presente que le notifique cuando hay datos para leer, cuando la conexión se desconectó .. Así que puedo eliminar el anterior dado while loop. ..Si no hay ninguna devolución de llamada, estoy listo mover este zócalo a otro hilo, que los bucles arounds y lee datos (que de hecho ya he hecho) …

**

EDIT Bounty tiempo de nuevo ..

**

Bueno, yo soy 2 desarrollador androide / java viejo con un buen 3.5 años de c / c ++ / experiencia de desarrollo objetivo c detrás de eso … Por lo tanto, he visto sockets nativos de bajo nivel c (que bloquea (configurable) cuando use read () Recv ()) y CFSocket de Apple (que es C socket en sí, pero proporcionan un envoltorio para proporcionar mecanismo de devolución de llamada). No estoy preguntando acerca de la codificación de un mecanismo de devolución de llamada aquí mismo (que estoy completamente dispuesto a hacer si no hay readymade alternativa Presente, pero ¿por qué reinventar la rueda de nuevo?) … Estoy empezando a entender java como plataforma muy avanzada y de alto nivel .. Pensé que debería haber alguna biblioteca de alto nivel de envoltura acechando alrededor .. Así que estoy pensando en aumentar la audiencia A este hilo iniciando una recompensa ..

No hay una devolución de llamada ya preparada para esto en Java. Puede implementar uno fácilmente utilizando las clases en el paquete NIO. En su mayoría necesita Selector y SocketChannel. Si está familiarizado con select (2), debe ser fácil de seguir. Si no, pruebe un tutorial de NIO.

http://download.oracle.com/javase/1.5.0/docs/api/java/nio/channels/SocketChannel.html http://download.oracle.com/javase/1.5.0/docs/api/java /nio/channels/Selector.html

En cualquier caso, tendrá que consultar el socket para comprobar si hay datos y no puede hacerlo en el subproceso principal. A menos que su aplicación Android deba administrar múltiples conexiones en el mismo hilo, podría ser mucho más fácil usar el bloqueo de E / S. Otra cosa a considerar: si esto tiene que ejecutarse continuamente / durante mucho tiempo necesita moverlo a un servicio. Incluso entonces, el sistema operativo puede matar, si se queda sin recursos, así que esté listo para manejar los reconexiones.

HTH

Aquí hay algo que puede probar:

Definir un controlador en java como este

 public interface NwkCallback { void handle(int code, Object obj); } 

Ahora defina una clase que maneje las operaciones de red:

 public class Nwk { static DefaultHttpClient CLIENT = null; static DefaultHttpClient c() { if (null == CLIENT) { // Create a httpclient } else return CLIENT; } } public static void onReceive(final Object data, final NwkCallback callback) { background(new Runnable() { @Override public void run() { try { // Write to server and wait for a response // Once you receive a response // return result back using // callback.handle(1,whatever_server_returned) } catch (Exception e) { Logger.e(e); } } } }); 

En el hilo de UI o en otro lugar, use el método onReceive as

 Nwk.onReceive(string_passed_to_server, new NwkCallback() { @Override public void handle(final int code, Object obj) { if(code==1) { // Print obj } } }); 

Si está buscando una muestra de una aplicación de Android que utilice un servicio para administrar conexiones de fondo a largo plazo, consulte ConnectBot:

http://code.google.com/p/connectbot/source/browse/

Utiliza un servicio para administrar conexiones de terminales. Es un conjunto muy complejo de código, sin embargo, probablemente tomar algunas excavaciones para averiguar los bits que desea hacer uso de.

La mayoría de las personas hacen conexiones de servidor a través de HTTP, y hay una correspondencia uno a uno entre los contextos de solicitud y callbacks. Así que podemos salir con un IntentService para manejar el fondo de las solicitudes, y pasar un ResultReceiver para obtener el servicio de llamar de nuevo a la interfaz de usuario de hilo cuando la solicitud se ha completado / no:

http://developer.android.com/reference/android/os/ResultReceiver.html

La misma técnica general debe aplicarse para las conexiones de socket de larga duración, aunque es probable que tenga que optar por una forma diferente de servicio para que pueda administrar el ciclo de vida por su cuenta. Pero si lo hace, debe ser capaz de tomar una intención con un ResultReceiver como parte de la requeue, la cola para el procesamiento, y luego enviar () en el ResultReceiver para obtener la devolución de llamada a la interfaz de usuario.

  • Conexión entre Python Server y la aplicación Android
  • UDP Multicasting desde el móvil a la PC
  • Comunicación de socket cliente / servidor de Android mediante Service o IntentService
  • Android VpnService proteger socket que se almacena en código nativo?
  • Android escucha los mensajes del socket del servidor
  • AsyncTask, doInBackground nunca se ejecuta en android
  • No obtiene respuesta en la conexión de socket
  • Reenvío de puertos Android
  • Android: ¿Cómo detectar la aplicación eliminada de la lista de aplicaciones recientes?
  • 'Permiso denegado' al conectarse al socket unix abstracto
  • Enviar / Recibir archivo / imagen Socket C # Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.