Comunicaciones
Un
teléfono móvil es capaz de realizar conexiones con un servidor. Esto
abre un vasto campo de aplicaciones y también muchas posibilidades en
el campo de los juegos. Una posible aplicación puede ser un servidor
que almacene las puntuaciones máximas entre todos los jugadores de un
juego, o incluso la posibilidad de juego online contra otros jugadores.
En
principio un MIDlet puede establecer diversos tipos de conexiones:
Sockets, http, https, datagramas, y otras, sin embargo, el standard sólo
obliga a la implementación del protocolo http, así que dependiendo del
dispositivo dispondremos de unos tipos de conexiones u otras. Para
mantener la compatibilidad es aconsejable utilizar las basadas en el
protocolo http y, por lo tanto, limitarnos a este tipo de conexión. La
clase Connector, que se encuentra en el paquete javax.microedition.io, es la base de las comunicaciones en los MIDlets. Para abrir una conexión utilizamos el método open() de la clase Connector.
Connector.open(String conexion);
El parámetro conexión es la URL a la que queremos conectar. El formato de la URL es el standard. Los siguientes son formatos válidos.
- http://www.dominio.com
- http://www.dominio.com:8080
- http://www.dominio.com/script.jsp?param1=1¶m2=2
Una
forma muy estandarizada de comunicación con un servidor es mediante
llamadas a scripts escritos en JSP, PHP o cualquier otro lenguaje de
script, y pasando los parámetros necesarios, ya sea por método post o
método get. Este script procesará la información y hará uso de ella,
por ejemplo, almacenándola en una base de datos. La escritura de
scripts se escapa del ámbito de este libro, sin embargo, podrás
encontrar numerosas publicaciones sobre el tema además de gran cantidad
de información en Internet.
Además de conexiones http, podemos abrir otros tipos de conexiones siempre que nuestro teléfono móvil lo soporte.
Conexión | URL |
---|---|
Socket | socket://www.dominio.com:8000 |
Datagramas | datagram://www.dominio.com:8000 |
Archivos | file:/datos.txt |
Puertos | comm:0;baudrate=9600 |
Una vez abierto el canal de comunicación podemos utilizar los métodos openInputStream() y openOutputStream() de la clase Connector para abrir una corriente de lectura o escritura mediante la cual, leer y escribir información.
El método openInputStream() devuelve un objeto del tipo InputStream,
que representa una corriente de entrada de bytes. Contiene algunos
métodos que permiten controlar la entrada de datos. Los más interesantes
son:
Método | Cometido |
---|---|
int available() | Número de bytes disponibles en la corriente de lectura |
void close() | Cierra la corriente |
abstract int read() | Lee el siguiente byte de la corriente |
De forma similar, el método openOutputStream() devuelve un objeto de tipo OutputStream, que representa una corriente de salida de bytes. Los métodos más interesantes son:
Método | Cometido |
---|---|
void close() | Cierra la corriente |
void flush() | Fuerza la salida de los bytes almacenados en el buffer |
void write(byte[] b) abstract void write(int b) | Escribe un byte o un array de bytes en la corriente de salida |
Nos resta conocer la clase HttpConnection, que gestiona una conexión basada en el protocolo http. Podemos crear una conexión de este tipo mediante el método open() de la clase Connector tal y como ya vimos.
HttpConnection c = (HttpConnection)Connector.open(url);
Algunos métodos interesantes son los siguientes:
Método | Cometido |
---|---|
String getHost() | Devuelve el nombre del host remoto |
int getPort() | Devuelve el puerto de conexión |
String getQuery() | Devuelve los parámetros pasados en la URL |
String getRequestMethod() | Devuelve el método de petición |
int getResponseCode() | Devuelve el código de respuesta |
String getResponseMessage() | Devuelve el mensaje de respuesta |
String getURL() | Devuelve la URL de la conexión |
void setRequestMethod(String method) | Establece el método de petición (GET, POST o HEAD) |
Para
ilustrar todo durante el capítulo, vamos a desarrollar un programa que
es capaz de conectar con un servicio web y obtener información. Nos
conectaremos a una web de noticias (weblog) y extraeremos las cabeceras
de las noticias para mostrarlas en nuestro móvil. La web que vamos a
utilizar es http://programacion.com/cursos/ags_j2me/www.barrapunto.com.
Esta web permite acceder a la información en formato XML en la URL http://backends.barrapunto.com/barrapunto.xml, que produce una salida como ésta (reproducimos aquí una sóla noticia):
http://barrapunto.com/article.pl?sid=04/01/21/1048222 fernand0 ssh-scp-ssh-keygen 85 36articles topicseguridad.png
Los títulos de las noticias están encerradas entre las etiquetas y , así que vamos a extraer el texto que se encuentre entre ambas.
import java.io.*; import javax.microedition.io.*; import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class Conexion extends MIDlet { private Display display; // Url que vamos a consultar String url = "http://backends.barrapunto.com/barrapunto.xml"; public Conexion() { display = Display.getDisplay(this); } public void startApp() { try { verNoticias(url); } catch (IOException e) {} } public void pauseApp() {} public void destroyApp(boolean unconditional) {} void verNoticias(String url) throws IOException { HttpConnection c = null; InputStream is = null; StringBuffer b = new StringBuffer(); StringBuffer salida = new StringBuffer(); TextBox t = null; try { c = (HttpConnection)Connector.open(url); c.setRequestMethod(HttpConnection.GET); c.setRequestProperty("IF-Modified-Since", "10 Nov 2000 17:29:12 GMT"); c.setRequestProperty("User-Agent","Profile/MIDP-1.0 Configuration/CLDC-1.0"); c.setRequestProperty("Content-Language", "es-ES"); is = c.openInputStream(); int ch, i, j; // leer los datos desde la URL while ((ch = is.read()) != -1) { b.append((char) ch); if (ch == '\n') { if (b.toString().indexOf("") > 0) {<br> i = b.toString().indexOf("<titl>")+7;<br> j = b.toString().indexOf(""); salida.append(b.toString().substring(i,j)); salida.append("\n-------------------\n"); } b.delete(0,b.length()); } } // mostrar noticias en la pantalla t = new TextBox("Noticias en barrapunto.com", salida.toString(), 1024, 0); } finally { if(is!= null) { is.close(); } if(c != null) { c.close(); } } display.setCurrent(t); } }