Programación de juegos para móviles con J2ME

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&param2=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
Socketsocket://www.dominio.com:8000
Datagramasdatagram://www.dominio.com:8000
Archivosfile:/datos.txt
Puertoscomm: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);
    } 
}

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
SIGUIENTE ARTÍCULO