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 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):
<?xml version="1.0" encoding="iso-8859-1" ?> <backslash xmlns:backslash="http://barrapunto.com/backslash.dtd"> <story> � <title>Tutorial de Secure Shell</title> � <url>http://barrapunto.com/article.pl?sid=04/01/21/1048222</url> � <time>2004-01-21 10:46:17</time> � <author>fernand0</author> � <department>ssh-scp-ssh-keygen</department> � <topic>85</topic> � <comments>36</comments> � <section>articles</section> � <image>topicseguridad.png</image> � </story> <story> </backslash>
Los t�tulos de las noticias est�n encerradas entre las etiquetas <title> y </title>, 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("<title>") > 0) { i = b.toString().indexOf("<title>")+7; j = b.toString().indexOf("</title>"); 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); } }