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);
}
}