"Android de la A a la Z" -- Unidad 9

2,514 views

Published on

***Proyecto PAPIIT IN102210***
UNAM. Facultad de Ingeniería.

Integrantes:
JUAN JOSE CARREON
J. ULISES GONZALEZ MEDINA
ANA LAURA GARCÍA ACOSTA
OMAR SIBAJA BAUTISTA
ROBERTO SOSA HIGAREDA

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,514
On SlideShare
0
From Embeds
0
Number of Embeds
318
Actions
Shares
0
Downloads
204
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

"Android de la A a la Z" -- Unidad 9

  1. 1. Android de la A a la Z Unidad 9 “Redes”IntroducciónTodo operador móvil admite redes de voz y datos de varios tipos. La parte más interesante de losdispositivos de Android es la red de datos, junto con la posibilidad de vincular los datos de una red adistintas aplicaciones. Estas aplicaciones se pueden generar con el enfoque basado en Intent y Servicedescrito en capítulos anteriores.Dicho enfoque combina intents incorporados (o personalizados) como navegación Web, con acceso acomponentes de hardware como un subsistema gráfico 3D, un receptor GPS, una cámara, almacenamientoextraíble, etc. Esta combinación de plataforma abierta, opciones de hardware, arquitectura de software yacceso a redes de datos es lo que hace que Android resulte tan atractivo.Con esto no afirmamos que la red de voz no sea importante (como veremos en un capítulo posterior) peroal hablar de redes nos centraremos en los datos.En términos de la red de datos, Android proporciona acceso de distintas formas: redes móviles IP(Protocolo de Internet), Wi-Fi y Bluetooth. En este caso nos centraremos en comunicar aplicaciones deAndroid con redes IP, a través de distintos enfoques.En términos de propiedades de conectividad, utilizaremos la clase ConnectivityManager para determinarcuándo está activa la conexión de red y de qué tipo es (móvil o Wi-Fi). A partir de aquí, utilizaremos la redde distintas formas con las aplicaciones de ejemplo.En este capítulo sobre redes no nos adentraremos en los detalles relacionados con las API Bluetooth o Wi-Fide Android. Bluetooth es una tecnología importante para redes inalámbricas entre dispositivos pero las APIrelacionadas con Android no están todavía completas (incluso en el SDK 1.0). Los dispositivos Androidadmiten Bluetooth pero de forma limitada y no está disponible en el emulador. Wi-Fi, por su parte, nocuenta con el correspondiente API y tampoco con una capa de emulación. Como el emulador no distingueel tipo de red utilizada y desconoce todo lo relacionado con Bluetooth y Wi-Fi, y como creemos que laimportancia radica en cómo se utiliza la red, no analizaremos estas API. Si necesita más información alrespecto, consulte la documentación de Androidhttp://code.google.com/android/reference/android/net/wifi/package-summary.html 1Elaborado por: J. Ulises González Medinaandroid.unam@gmail.comNoviembre 2011Versión 1.2
  2. 2. Android de la A a la Z Unidad 9 “Redes”En la aplicación de este capítulo, NetworkExplorer, veremos formas de comunicarnos con la red en Androide incluiremos diversas utilidades. En última instancia, esta aplica¬ción tendrá varias pantallas paradiferentes técnicas de redTras analizar la red IP general y su relación con Android, veremos cómo convertir el servidor en un API másrobusto por medio de servicios Web. Trabajaremos con XML sobre HTTP (POX) y REST (Transferencia deEstado de Representación). Además, describiremos el protocolo SOAP (Protocolo de Acceso Sencillo aObjetos). Analizaremos las ventajas e inconvenientes de los distintos enfoques y las razones para elegir unou otro para un cliente Android.Antes de adentrarnos en los detalles de aplicaciones Android en red, repasaremos los conceptos básicos. Siya dispone de sólidos conocimientos sobre redes puede pasar al siguiente apartado pero es importantecontar con esta base para el futuro.Redes por todos lados. Conceptos básicosUn grupo de equipos interconectados es una red. Con el tiempo, las redes han pasado de ser algodisponible únicamente para gobiernos y grandes empresas a convertirse en la sorprendente Internet.Aunque el concepto es sencillo, permitir la comunicación entre ordenadores, las redes implican ciertatecnología avanzada. No abordaremos todos los detalles pero sí los conceptos básicos de las redesgenerales.En la mayoría de los casos, las API utilizadas para programar aplicaciones Android abstraen los detalles dered subyacentes. Lo que es positivo. Las API y los protocolos de red se han diseñado para que noscentremos en las aplicaciones y no nos preocupemos por enrutadores y entrega de paquetes.No obstante, conviene conocer el funcionamiento de una red para mejorar el diseño y la resolución deerrores de nuestras aplicaciones. Para ello, analizaremos algunos de los conceptos generales de redes, conparada en TCP/IP (Protocolo de Control de Transmisiones/Protocolo de Internet). Comenzaremos connodos, capas y protocolos. 2Elaborado por: J. Ulises González Medinaandroid.unam@gmail.comNoviembre 2011Versión 1.2
  3. 3. Android de la A a la Z Unidad 9 “Redes”Nodos y más nodosEl concepto básico de una red es que los datos se envíen entre dispositivos conectados con determinadasdirecciones. Las conexiones se pueden realizar a través de cables, ondas de radio, etc. Cada dispositivo condirección se denomina nodo. Un nodo puede ser una centralita, un PC o cualquier otro dispositivo con unapila de red y conectividad, como un dispositivo manual de Android.El protocolo TCP/IP Los protocolos son un conjunto de reglas de comunicación predefinidas y acordadas. Suelen situarse unos sobre otros ya que asumen distintos niveles de responsabilidad. Por ejemplo, en la pila TCP/IP, utilizada en la mayoría de tráfico Web de todo tipo y con Android, las capas principales son las siguientes:  La capa de enlace, que incluye protocolos de resolución de direcciones de dispositivos físicos como ARP, RARP y otros.  La capa de Internet, que incluye el propio IP, con varias versiones, y los protocolos ping, ICMP, entre otros.  La capa de transporte, donde encontramos distintos protocolos de entrega como TCP y UDP.  La capa de aplicaciones, que incluye protocolos conocidos como HTTP, FTP, SMTP, IMAP, POP, DNS, SSH y SOAP.Las capas son una abstracción de los distintos niveles de una pila de protocolos de red. El nivel más bajo, lacapa de enlace, se preocupa de dispositivos y direcciones físicos. El siguiente nivel, la capa de Internet, sepreocupa de direcciones y detalles de datos generales. Tras ésta, la capa de transporte se encarga de losdetalles de entrega. Por último, los protocolos de capa de aplicaciones de nivel superior utilizan la capasituada debajo y son específicos de cada aplicación para enviar archivos y correo electrónico o ver páginasWeb. 3Elaborado por: J. Ulises González Medinaandroid.unam@gmail.comNoviembre 2011Versión 1.2
  4. 4. Android de la A a la Z Unidad 9 “Redes”Direcciones IPIP se encarga del sistema de direcciones y de la entrada de datos en pequeños fragmentos denominadospaquetes. Los paquetes, conocidos en términos IP como datagramas, definen la cantidad de datos de cadafragmento, los límites de carga e información de encabezados, etc. Las direcciones IP indican de dóndeproviene cada paquete (su origen) y a dónde se dirige (su destino).Las direcciones IP tienen distintos tamaños en función de la versión del protocolo utilizado pero sin duda elmás habitual actualmente es el de 32 bits. Las direcciones IP de 32 bits (IPv4) se suelen escribir en unanotación decimal que separa los 32 bits en cuatro secciones, cada una para representar 8 bits (octeto)como por ejemplo 74.125.45.100.Determinadas clases de direcciones IP tienen un papel y un significado especiales. Por ejemplo, 127siempre identifica una dirección local del equipo; esta clase no se comunica con otros dispositivos(solamente se puede utilizar dentro de un equipo). Las direcciones que empiezan por 10 ó 192 se puedencomunicar con otros dispositivos del mismo segmento de red local pero no con otros segmentos. Todas lasdirecciones de un segmento de red concreto deben ser exclusivas para evitar conflictos.El enrutamiento de paquetes en una red IP, cómo recorren la red y pasan de un segmento a otro, se realizaen enrutadores. Los enrutadores se comunican entre sí por medio de direcciones IP y otra informaciónrelacionada con IP. Clase Formato Número de Número de Rango de direcciones de Máscara de (r=red, redes hosts por redes subred h=host) red A r.h.h.h 128 16777214 0.0.0.0 - 127.0.0.0 255.0.0.0 B r.r.h.h 16384 65534 128.0.0.0 - 191.255.0.0 255.255.0.0 C r.r.r.h 2097152 254 192.0.0.0 - 223.255.255.0 255.255.255.0 D grupo - - 224.0.0.0 - 239.255.255.255 - E no válidas - - 240.0.0.0 - 255.255.255.255 - 4Elaborado por: J. Ulises González Medinaandroid.unam@gmail.comNoviembre 2011Versión 1.2
  5. 5. Android de la A a la Z Unidad 9 “Redes”TCP vs UDPTCP y UDP son distintos tipos de protocolos de entrega que se suelen utilizar con TCP/IP. TCP es fiable yUDP es más directo. Esto quiere decir que TCP incluye datos adicionales para garantizar el orden de lospaquetes y para enviar un acuse de recibo (como sucede con el correo certificado tradicional). UDP, por suparte, no proporciona orden ni acuse de recibo (es como una carta normal, más barata y rápida de enviarpero no sabemos si el destinatario la recibirá). UDP TCP Servicio sin conexión; no se Servicio orientado a la conexión; se establece una sesión entre los establece una sesión entre los hosts. hosts. TCP garantiza la entrega mediante UDP no garantiza ni confirma la el uso de confirmaciones y la entrega, y no secuencia los datos. entrega secuenciada de datos. Los programas que utilizan UDP Los programas que utilizan TCP son responsables de proporcionar proporcionan la seguridad del la confiabilidad necesaria para el transporte de datos confiable. transporte de datos. UDP es rápido, tiene requisitos de TCP es más lento, tiene requisitos carga pequeños y puede admitir la de carga mayores y sólo admite la comunicación punto a punto y de comunicación punto a punto. un punto a varios puntos. 5Elaborado por: J. Ulises González Medinaandroid.unam@gmail.comNoviembre 2011Versión 1.2
  6. 6. Android de la A a la Z Unidad 9 “Redes”Protocolos de aplicaciones Después de enviar y entregar un paquete, la aplicación toma el control. Para enviar un mensaje de correo, por ejemplo, SMTP define un riguroso conjunto de procedimientos. Es necesario saludar y presentarse de una forma concreta; después proporcionar información de origen y destino, seguida por un mensaje en un formato concreto. Del mismo modo, HTTP define el conjunto de reglas para Internet, qué métodos se permiten (GET, POST, PUT, DELETE) y el funcionamiento general del sistema de solicitudes y respuestas entre cliente y servidor.Al trabajar con Android y API relacionadas con Java en general, no es necesario adentrarse en los detallesde nivel inferior pero sí conocer sus principales diferencias para la resolución de problemas, así como tenerconocimientos sobre direcciones IP. Además, es aconsejable conocer el funcionamiento de clientes yservidores, y cómo se establecen las conexiones a través de puertos.PuertosTodo el que haya utilizado un navegador Web está familiarizado con el modelo infor¬mático decliente/servidor. Los datos, en cualquier formato, se almacenan en un potente servidor centralizado. Losclientes se conectan a dicho servidor a través de un protocolo concreto (como HTTP) para recuperar losdatos y utilizarlos.Este patrón es evidentemente mucho más antiguo que la Web y se ha aplicadoprácticamente en todo desde terminales conectadas a sistemas centrales hastamodernas aplicaciones de escritorio que se conectan a un servidor para realizarparte de sus operaciones (como iTunes, básicamente un organizador y reproductormultimedia pero que también tiene una tienda donde los clientes se conectan a un 6Elaborado por: J. Ulises González Medinaandroid.unam@gmail.comNoviembre 2011Versión 1.2
  7. 7. Android de la A a la Z Unidad 9 “Redes”servidor para conseguir nuevos contenidos). En cualquier caso, el concepto es el mismo: el cliente realizauna solicitud al servidor y éste responde.Es el mismo modelo empleado por la mayoría de aplicaciones Android, al menos de las que usan unservidor (por lo general, las aplicaciones Android suelen acabar como cliente). Para procesar varias solicitudes cliente, para distintos propósitos, que una dirección IP reciba simultáneamente, los sistemas operativos de servidor modernos recurren al concepto de puertos. Los puertos no son físicos; son una representación de una determinada zona de memoria del ordenador. Un servidor puede escuchar en varios puertos designados en una misma dirección; por ejemplo, un puerto para enviar correo electrónico, otro para el tráfico Web, dos para la transferencia de archivos, etc.Todo equipo con una dirección IP también admite miles de puertos para habilitar múltiples conversacionessimultáneas. Los puertos se dividen en tres categorías:Los puertos conocidos se publican y son simplemente eso, conocidos, HTTP es el puerto 80 (y HTTPS, elpuerto 443), FTP utiliza los puertos 20 (control) y 21 (datos), SSH es el puerto 22, SMTP es el puerto 25, etc.Tras éstos, los puertos registrados siguen estando controlados y publicados pero para funciones másconcretas. Suelen utilizarse para una determinada aplicación o empresa; por ejemplo, MySQL es el puerto3306 (de forma predeterminada). Si necesita más información al respecto, consulte el documento denúmeros de puerto ICANN.Los puertos dinámicos o privados no están registrados intencionadamente ya que los utiliza la pila TCP/IPpara facilitar las comunicaciones. Se registran dinámicamente en cada ordenador y se utilizan en laconversación. El puerto dinámico 49500, por ejemplo, se puede utilizar para enviar una solicitud a unservidor Web y procesar la respuesta posterior. Una vez terminada la conversación, el puerto se reclama yse puede reutilizar localmente para otra transferencia de datos.Así pues, clientes y servidores se comunican como los nodos con direcciones, por medio de puertos en unared que admite varios protocolos. Los protocolos implicados en Android se basan en la red IP en la queparticipa la plataforma. Antes de crear una aplicación Android cliente/servidor completa con la red, esnecesario determinar el estado de la conexión. 7Elaborado por: J. Ulises González Medinaandroid.unam@gmail.comNoviembre 2011Versión 1.2
  8. 8. Android de la A a la Z Unidad 9 “Redes”Checando el estado de la redAndroid ofrece multitud de utilidades para determinar la configuración de los dispositivos y el estado dediversos servicios, incluida la red. Normalmente se utiliza la clase ConnectivityManager para determinar sihay conectividad de red y para saber cambios en la misma. El listado 6.1 muestra parte de la actividadprincipal de la aplicación NetworkExplorer, para ilustrar el uso básico de ConnectivityManager.@Override public void onStart() { super.onStart(); ConnectivityManager cMgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo netInfo = cMgr.getActiveNetworkInfo(); this.status.setText(netInfo.toString()); }Este breve ejemplo demuestra que se puede acceder a ConnectivityManager a tra¬vés del métodogetSystemService del contexto si pasamos la constante CONNECTIVY_ SERVICE. Una vez conseguido,podemos obtener información de red a través del objeto Networklnfo.El objeto Networklnfo también permite acceder a información más detallada pero por lo general basta conla información básica (a menos que sea un caso especial como la creación de una aplicación deadministración del estado de la red).Una vez que sabemos que estamos conectados, ya sea a través de móvil o Wi-Fi, podemos usar la red IP.Para nuestra aplicación NetworkExplorer, comenzaremos con la conexión IP más rudimentaria, un socket,hasta llegar a HTTP y los servicios Web.Establecer comunicación con un socket de servidorUn socket de servidor es un flujo en el que puede leer o escribir bytes sin procesar, en una dirección IP ypuerto concretos. De este modo puede centrarse en los datos sin preocuparse de tipos de medios, tamañosde paquetes, etc. Es otra abstracción de red que pretende facilitar la labor del programador. La filosofía delos socket de que todo debe parecer E/S de archivos para el programador, proviene de la familia deestándares POSIX, que han adoptado la mayoría de sistemas operativos actuales.Antes de pasar a los niveles superiores de la comunicación por red, comenzaremos con un socket sinprocesar. Para ello necesitamos un servidor que escuche en un puerto concreto. El código EchoServer(mostrado más abajo) se encarga de este aspecto. No es una clase específica de Android, sino un servidorsimplificado que se puede ejecutar en cualquier equipo anfitrión con Java. Posteriormente nosconectaremos al mismo desde un cliente Android.public final class EchoServer extends Thread { private static final int PORT = 8889; private EchoServer() { } 8Elaborado por: J. Ulises González Medinaandroid.unam@gmail.comNoviembre 2011Versión 1.2
  9. 9. Android de la A a la Z Unidad 9 “Redes” public static void main(final String args[]) { EchoServer echoServer = new EchoServer(); if (echoServer != null) { echoServer.start(); } } public void run() { try { ServerSocket server = new ServerSocket(PORT, 1); while (true) { Socket client = server.accept(); System.out.println("Client connected"); while (true) { BufferedReader reader = new BufferedReader(newInputStreamReader(client.getInputStream())); System.out.println("Read from client"); String textLine = reader.readLine() + "n"; if (textLine.equalsIgnoreCase("EXITn")) { System.out.println("EXIT invoked, closing client"); break; } BufferedWriter writer = new BufferedWriter(newOutputStreamWriter(client.getOutputStream())); System.out.println("Echo input to client"); writer.write("ECHO from server: " + textLine, 0, textLine.length() +18); writer.flush(); } client.close(); } } catch (IOException e) { System.err.println(e); } }}La clase EchoServer es básicamente E/S de Java. Amplía Thread e implementa run, de modo que cadacliente conectado se puede procesar en su propio contexto. Tras ello utilizamos ServerSocket para escucharen un puerto definido. Cada cliente es, por tanto, una implementación de Socket. La entrada del cliente seañade a BufferedReader del que se lee cada línea. La única consideración de este sencillo servidor es que sila entrada es EXIT, acaba el bucle y sale. Si la entrada no solicita la salida, el servidor reproduce la entradaen el OutputStream del cliente por medio de BufferedWriter.Es una representación muy básica del funcionamiento de un servidor. Procesa las entradas, normalmenteen un subproceso independiente, y después responde al cliente en función de las mismas. Para probar elservidor antes de utilizar Android, puede acceder por medio de telnet al puerto especificado (una vezejecutado el servidor) e introducir una entrada; si todo funciona correctamente, reproducirá el resultado.Para ejecutar el servidor debe invocarlo localmente con Java. Tiene un método principal, de modo que seejecuta independientemente; comience desde la línea de comandos o desde el IDE. Recuerde que alconectarse a un servidor desde el emulador, debe conectarse a la dirección IP del host en el que ejecute elproceso del servidor; no 127.0.0.1. El emulador se considera a sí mismo 127.0.0.1, así que debe utilizar la 9Elaborado por: J. Ulises González Medinaandroid.unam@gmail.comNoviembre 2011Versión 1.2
  10. 10. Android de la A a la Z Unidad 9 “Redes”dirección del host al intentar conectarse desde Android. (Para averiguar la dirección IP del equipo en el quese encuentre, introduzca ifconfig en Linux o Mac, o ipconfig en Windows.)La parte correspondiente al cliente del ejemplo es donde comienza NetworkExplorer, con el métodocallSocket de la actividad SimpleSocket, dicho código se presenta a continuación.public class SimpleSocket extends Activity { private static final String CLASSTAG = SimpleSocket.class.getSimpleName(); private EditText ipAddress; private EditText port; private EditText socketInput; private TextView socketOutput; private Button socketButton; @Override public void onCreate(final Bundle icicle) { super.onCreate(icicle); this.setContentView(R.layout.simple_socket); this.ipAddress = (EditText) findViewById(R.id.socket_ip); this.port = (EditText) findViewById(R.id.socket_port); this.socketInput = (EditText) findViewById(R.id.socket_input); this.socketOutput = (TextView) findViewById(R.id.socket_output); this.socketButton = (Button) findViewById(R.id.socket_button); this.socketButton.setOnClickListener(new OnClickListener() { public void onClick(final View v) { socketOutput.setText(""); String output = callSocket(ipAddress.getText().toString(),port.getText().toString(), socketInput.getText().toString()); socketOutput.setText(output); } }); } private String callSocket(final String ip, final String port, final StringsocketData) { Socket socket = null; BufferedWriter writer = null; BufferedReader reader = null; String output = null; try { socket = new Socket(ip, Integer.parseInt(port)); writer = new BufferedWriter(newOutputStreamWriter(socket.getOutputStream())); reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); // send input terminated with n String input = socketData; writer.write(input + "n", 0, input.length() + 1); writer.flush(); 10Elaborado por: J. Ulises González Medinaandroid.unam@gmail.comNoviembre 2011Versión 1.2
  11. 11. Android de la A a la Z Unidad 9 “Redes” // read back output output = reader.readLine(); Log.d(Constants.LOGTAG, " " + SimpleSocket.CLASSTAG + " output - " + output); // send EXIT and close writer.write("EXITn", 0, 5); writer.flush(); } catch (IOException e) { Log.e(Constants.LOGTAG, " " + SimpleSocket.CLASSTAG + " IOException callingsocket", e); } finally { try { writer.close(); } catch (IOException e) { // swallow } try { reader.close(); } catch (IOException e) { // swallow } try { socket.close(); } catch (IOException e) { // swallow } } return output; };}En este caso utilizamos el método onCreate para invocar un método de ayuda privado callSocket yestablecer el resultado en TextView. Dentro del método callSocket creamos un Socket para representar ellado cliente de la conexión y establecemos el componente de escritura de la entrada y un lector para elresultado. Una vez abordadas las tareas de mantenimiento, escribimos en el socket, que se comunica con elservidor, y obtenemos el valor de resultado que devolver.Un socket es probablemente el uso de red de nivel inferior en Android. Aunque ofrece una granabstracción, debemos encargarnos de muchos de los detalles (en concreto del lado del servidor,subprocesos y cola). En muchos casos tendrá que utilizar un socket (si el lado del servidor ya existe), perolas soluciones de nivel superior como HTTP ofrecen numerosas ventajas.Solicitudes HTTPComo vimos en el apartado anterior, puede utilizar un socket para transferir datos IP con Android. Es unenfoque importante que hay que tener en cuenta para disponer de dicha opción y conocer los detallessubyacentes. No obstante, puede evitar esta técnica siempre que pueda y aprovechar en su lugarproductos de servidor ya existentes para enviar sus datos. La forma más habitual de hacerlo consiste enutilizar un servidor Web con HTTP. 11Elaborado por: J. Ulises González Medinaandroid.unam@gmail.comNoviembre 2011Versión 1.2
  12. 12. Android de la A a la Z Unidad 9 “Redes”A continuación veremos cómo realizar solicitudes HTTP desde un cliente Android y enviarlas a un servidorHTTP. Permitiremos que el servidor HTTP procese todos los detalles y nos centraremos en la aplicaciónAndroid cliente.¿Qué es java.net? Se refiere a la API o paquete de Java: java.net, el cual permite realizar conexiones y transacciones a través de la red. Utilizando el paquete java.net podemos comunicar dos o más computadoras que estén en distintas partes del mundo. Se usa en combinación con las clases del paquete java.io para leer y escribir datos en la red.Para consultar de manera detallada la documentación de java.net, se sugiere consultar la página web:http://download-llnw.oracle.com/javase/6/docs/api/index.html 12Elaborado por: J. Ulises González Medinaandroid.unam@gmail.comNoviembre 2011Versión 1.2
  13. 13. Android de la A a la Z Unidad 9 “Redes”El método de solicitud HTTP más básico es GET. En este tipo de solicitud, los datos enviados se incrustan enel URL de la cadena de consulta. La siguiente clase de la aplicación NetworkExplorer, (véase el listado 6.4),incluye una actividad que lo demuestra.public class SimpleGet extends Activity { private static final String CLASSTAG = SimpleGet.class.getSimpleName(); private EditText getInput; private TextView getOutput; private Button getButton; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.simple_get); this.getInput = (EditText) findViewById(R.id.get_input); this.getOutput = (TextView) findViewById(R.id.get_output); this.getButton = (Button) findViewById(R.id.get_button); this.getButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { getOutput.setText(""); String output = getHttpResponse(getInput.getText().toString()); if (output != null) { getOutput.setText(output); } } }); 13Elaborado por: J. Ulises González Medinaandroid.unam@gmail.comNoviembre 2011Versión 1.2
  14. 14. Android de la A a la Z Unidad 9 “Redes” }; /** * Perform an HTTP GET with HttpUrlConnection. * * @param location * @return */ private String getHttpResponse(String location) { String result = null; URL url = null; Log.d(Constants.LOGTAG, " " + SimpleGet.CLASSTAG + " location = " + location); try { url = new URL(location); Log.d(Constants.LOGTAG, " " + SimpleGet.CLASSTAG + " url = " + url); } catch (MalformedURLException e) { Log.e(Constants.LOGTAG, " " + SimpleGet.CLASSTAG + " " + e.getMessage()); } if (url != null) { try { HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); BufferedReader in = new BufferedReader(newInputStreamReader(urlConn.getInputStream())); String inputLine; int lineCount = 0; // limit the lines for the example while ((lineCount < 10) && ((inputLine = in.readLine()) != null)) { lineCount++; Log.v(Constants.LOGTAG, " " + SimpleGet.CLASSTAG + " inputLine = " +inputLine); result += "n" + inputLine; } in.close(); urlConn.disconnect(); } catch (IOException e) { Log.e(Constants.LOGTAG, " " + SimpleGet.CLASSTAG + " " + e.getMessage()); } } else { Log.e(Constants.LOGTAG, " " + SimpleGet.CLASSTAG + " url NULL"); } return result; }}Para obtener una respuesta HTTP y mostrar las primeras líneas en nuestra clase SimpleGet, invocamos unmétodo getHttpResponse. En este método construimos un objeto java.net. URL, que se encargaautomáticamente de muchos de los detalles, y después abrimos una conexión a un servidor por medio deHttpurlConnection.Seguidamente utilizamos BufferedReader para leer datos de la conexión una línea por vez. Recuerde quemientras lo hacemos, utilizamos el mismo subproceso de la IU y, por tanto, la bloqueamos, lo que no esaconsejable. Únicamente lo hacemos para ilustrar el funcionamiento de la red; en un apartado posteriorveremos cómo utilizar un subproceso independiente. Una vez obtenidos los datos, los añadimos a lacadena de resultado devuelta por el método y cerramos el lector y la conexión. Gracias a la sencillacompatibilidad de Android con java.net, podemos acceder a los recursos de red HTTP. 14Elaborado por: J. Ulises González Medinaandroid.unam@gmail.comNoviembre 2011Versión 1.2
  15. 15. Android de la A a la Z Unidad 9 “Redes”Esta forma de comunicación con HTTP es muy sencilla pero se puede complicar si necesitamos algo másque recuperar datos y, como hemos indicado, el bloqueo que genera esta técnica no es aconsejable.Podemos solucionar algunos de estos problemas si utilizamos subprocesos independientes y realizamos suseguimiento, y si creamos nuestra propia estructura de API para cada solicitud HTTP, pero no seránecesario. Afortunadamente, Android proporciona otro conjunto de API en la biblioteca HttpClient deApache que abstraen las clases de java.net y que ofrece una mayor compatibilidad con HTTP parasolucionar el problema de los subprocesos independientes. 15Elaborado por: J. Ulises González Medinaandroid.unam@gmail.comNoviembre 2011Versión 1.2

×