¿Cómo obtener datos desde / hacia un socket en un hilo?
Android noob aquí. Aprendo lo mejor viendo el código fuente de un ejemplo funcional, pero no he podido encontrar un ejemplo sencillo pero completo de usar un socket en su propio subproceso.
Tengo un servicio de Android que necesita comunicarse con Internet. Quiero abrir un socket TCP que se conecta a un servidor en Internet. El servicio necesita enviar datos a Internet, y los datos que regresan de la red tendrán que ir al servicio. Puesto que el servicio está haciendo otras cosas también, la conexión del zócalo necesita vivir en su propio hilo de rosca.
- Conectar la aplicación android a un servidor sockjs
- Android trata con dispositivos IoT sin conexión a Internet
- ¿Qué eventos pueden despertar un dispositivo Android durmiente?
- Problema al conectar la aplicación de Android al socket mediante la conexión de celda
- FIXED: No se puede conectar a adb a través de wifi
¿Alguna idea de dónde podría encontrar un ejemplo de un zócalo en un hilo con la comunicación a / desde el zócalo?
Gracias
- Múltiples hilos de lectura desde el mismo socket
- ¿Cómo administrar una conexión Bluetooth en Android a través de cambios de configuración?
- Uso de Socket.IO en Android siempre devuelve error de sondeo XHR
- Comunicación de socket con Python en Android
- Android: Socket - java.net.SocketException: sendto ha fallado: EPIPE (Broken pipe)
- Aplicación de Android que trabaja en WIFI y 3G (Sin proxy), pero no funciona en 3G (Si proxy y puerto están asignados)
- Android Wifip2p: ¿Por qué la información de grupo es nula después de conectarse con el propietario del grupo
- ¿Cómo crear socket Raw en Android?
Sólo tiene que crear una tarea asíncrona que se comunique en segundo plano y, a continuación, actualiza el hilo de la interfaz de usuario según sea necesario. Aquí está el hilo de fondo para obtener información de un socket y actualizar una vista de texto con el número de bytes que recibe
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í está cómo usted lanzaría 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(); } }
Aquí hay un blog largo sobre este tema, donde tanto el servidor y las partes del cliente se muestran, con la comunicación del zócalo pasando por un hilo separado.
Una cosa a tener en cuenta es que si usted está pasando int
s se puede ejecutar en un problema de orden de bytes, por lo que, sólo hacer algunas pruebas y le sugiero que asegúrese de que el servidor envía en el formato que el Android necesita, en el caso Tiene servidores en más de un sistema operativo.
Para una manera simple, 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, la orden de los bytes puede intercambiarse para la optimización: http://en.wikipedia.org/wiki/Dalvik_(software)